![](/img/trans.png)
[英]What is the difference between getchar/putchar, gets/puts and fgets/fputs (in C)?
[英]Difference between fgets and gets
fgets()
和gets()
什么區別?
當用戶點擊“輸入”時,我試圖打破循環。 它與gets()
配合良好,但我不想使用gets()
。 我嘗試了fgets()
和scanf()
但結果與gets()
。 無論用戶輸入什么文本, fgets()
中斷循環! 這是我的代碼:
void enter(void)
{
int i,
for(i=top; i<MAX; i++)
{
printf(".> 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()
和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()
和 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<MAX; i++)
{
if (read1line(".> 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)緩沖區已滿1或-
2)遇到'\\n'
n'-或-
3)流達到文件結束條件-或-
4)發生輸入錯誤。
gets()
上面的#2-#4, 但它會掃描,但不會保存'\\n'
。
gets()
在C99中已貶值,並且不再是C11的一部分。
get和fgets之間的問題區別在於,gets從輸入行中刪除了結尾的'\\ n',但fgets保留了它。
這意味着fgets返回的“空”行實際上是字符串“ \\ n”。
令人討厭的區別是,最好避免完全獲取,如果給出的行太長,則程序將以非常糟糕的方式崩潰。
您可以將fgets()
與STDIN結合使用。 此函數是安全的,始終在字符串末尾插入“ \\ 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'。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.