fgets和gets之间的区别
fgets()
和gets()
什么区别?
当用户点击“输入”时,我正试图打破我的循环。 它与gets()
一起运行良好,但我不想使用gets()
。 我尝试使用fgets()
和scanf()
但是我没有与gets()
相同的结果。 无论用户在文本中输入什么, fgets()
打破循环! 这是我的代码:
void enter(void) { int i, for(i=top; i Enter name (ENTER to quit): "); gets(cat[i].name); if(!*cat[i].name) break; printf(".> Enter Last Name: "); scanf("%s",cat[i].lastname); printf(".> Enter Phone Number: "); scanf("%s",cat[i].phonenum); printf(".> Enter e-Mail: "); scanf("%s",cat[i].info.mail); printf(".> Enter Address: "); scanf("%s",cat[i].info.address); printf("\n"); } top = i; }
删除gets()
和 scanf()
。
创建一个辅助函数来处理和限定用户输入。
// Helper function that strips off _potential_ \n char *read1line(const char * prompt, char *dest, sizeof size) { fputs(prompt, stdout); char buf[100]; *dest = '\0'; if (fgets(buf, sizeof buf, stdin) == NULL) { return NULL; // EOF or I/O error } // Remove potential \n size_t len = strlen(buf); if (len > 0 && buf[len-1] == '\n') { buf[--len] = `\0`; } // Line is empty or too long if (len == 0 || len >= size) return NULL; return memcpy(dest, buf, len+1); } void enter(void) { int i; for(i=top; i Enter name (ENTER to quit): ", cat[i].name, sizeof cat[i].name) == NULL) break; if (read1line(".> Enter Last Name: ", cat[i].lastname, sizeof cat[i].lastname) == NULL) break; if (read1line(".> Enter Phone Number: ", cat[i].phonenum, sizeof cat[i].phonenum) == NULL) break; if (read1line(".> Enter e-Mail: ", cat[i].info.mail, sizeof cat[i].info.mail) == NULL) break; if (read1line(".> Enter Address: ", cat[i].info.address, sizeof cat[i].info.address) == NULL) break; } top = i; }
fgets()
和gets()
一些属性:
fgets()
读取输入并保存到缓冲区,直到:
1)缓冲区是满的 – 或 –
2)遇到'\n'
– 或 –
3)流达到文件结束条件 – 或 –
4)发生输入错误。
gets()
执行#2 – #4, 除非它扫描,但不保存'\n'
。
gets()
在C99中折旧,不再是C11的一部分。
gets()
和fgets()
之间的区别在于fgets()
将换行符留在缓冲区中。 因此,不是检查输入的第一个元素是否为0
,而是检查它是否为'\n'
;
fgets(cat[i].name, sizeof cat[i].name, stdin); if (cat[i].name[0] == '\n' || cat[i].name[0] == 0) { // empty line or no input at all break; } else { // remove the trailing newline int len = strlen(cat[i].name); cat[i].name[len-1] = 0; }
gets和fgets之间存在的问题是,gets会从输入行中删除尾随’\ n’,但fgets会保留它。
这意味着fgets返回的“空”行实际上是字符串“\ n”。
令人讨厌的差异,这意味着最好避免完全失败,就是如果你给出一条太长的线,你的程序会以非常糟糕的方式崩溃。
你可以使用fgets()
代替STID。 此function是安全的,并始终在字符串末尾插入’\ 0’。
一个例子:
char inputbuffer[10]; char *p; p = fgets(inputbuffer, sizeof(inputbuffer), stdin); printf(">%s<\n", p); /* p is NULL on error, but printf is fair */
在此示例中,您将获得最多9个字符+'\ 0'。