fgets和gets之间的区别 [英] Difference between fgets and gets
问题描述
fgets()
和gets()
有什么区别?
当用户仅点击输入"时,我正在尝试打破循环.它与gets()
一起使用时效果很好,但是我不想使用gets()
.
我尝试使用fgets()
和scanf()
,但结果与使用gets()
的结果不同. fgets()
打破循环,无论用户输入文本是什么!这是我的代码:
I am trying break my loop when the user hits just "enter". It's working well with gets()
, but I don't want to use gets()
.
I tried with fgets()
and scanf()
but I don't have the same results as with gets()
. fgets()
breaks the loop whatever user enters in text! Here is my code :
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()
和 scanf()
.
创建一个帮助函数来处理和限定用户输入.
Drop gets()
and scanf()
.
Create a helper function to handle and qualify user input.
// 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()
的某些属性:
Some attributes of fgets()
and gets()
:
fgets()
读取输入并将其保存到缓冲区,直到:
1)缓冲区已满1或-
2)遇到'\n'
-或-
3)流达到文件结束条件-或-
4)发生输入错误.
fgets()
reads input and saves to a buffer until:
1) The buffer is 1 shy of being full - or -
2) '\n'
is encountered - or -
3) The stream reaches an end-of-file condition - or -
4) An input error occurs.
gets()
会执行以外的#2-#4,但不会保存'\n'
.
gets()
在C99中已贬值,并且不再是C11的一部分.
gets()
does #2 - #4 above except it scans, but does not save a '\n'
.
gets()
is depreciated in C99 and no longer part of C11.
这篇关于fgets和gets之间的区别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!