pur*_*ure 5 c gets scanf fgets
fgets()和 和有什么区别gets()?
当用户点击“输入”时,我试图打破循环。它与 配合得很好gets(),但我不想使用gets()。我尝试使用fgets()andscanf()但没有得到与使用相同的结果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;
}
Run Code Online (Sandbox Code Playgroud)
放下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;
}
Run Code Online (Sandbox Code Playgroud)
fgets()和的一些属性gets():
fgets()读取输入并保存到缓冲区,直到:
1) 缓冲区即将满 - 或 -
2)'\n'遇到 - 或 -
3) 流达到文件结束条件 - 或 -
4) 发生输入错误。
gets()执行上面的 #2 - #4 ,但它会扫描,但不会保存'\n'.
gets()在 C99 中已贬值,不再是 C11 的一部分。