我有这个程序:
#include <stdio.h>
#define SIZE 19
int main(){
char string[SIZE];
while (string[0] != 'A'){
printf("\nEnter a new string.\n");
fgets(string,SIZE,stdin);
int storage = 0;
while (storage != '\n')
{
storage = getchar();
}
}
}
如果输入的字符串超过了string[]可以容纳的最大字符数,则存在带有getchar()的嵌套while循环。如果不存在,输入一个字符串,例如20个字符,将导致输出为:
Enter a new string.
12345123451234512345
Enter a new string.
Enter a new string.
问题是,这需要我按两次enter键才能输入一个新字符串:一次用于'fgets‘,另一次用于嵌套的while循环(这是我对所发生的事情的理解)。
有没有办法改变这一点,让我只需按回车键一次,或者有可能把整个while循环变成更优雅的东西?
发布于 2018-07-08 07:06:27
如果从fgets
接收的缓冲区包含换行符,您知道它会读取输入的所有内容,因此您不需要执行任何其他操作。如果不是,则使用额外的循环来刷新缓冲区。
发布于 2018-07-08 08:03:07
如果(且仅当)缓冲区足够长,可以到达并包含换行符,以及尾随的nul结束符,则fgets()
会读取换行符。
您的示例输入是20个字符,后面是一个换行符,然后是nul结束符。它不会进入19个字符的缓冲区。
简单的方法是在循环中使用fgets()
,直到换行符包含在缓冲区中。
printf("\nEnter a new string.\n");
do
{
fgets(string,SIZE,stdin);
/*
handle the input, noting it may or may not include a trailing '\n'
before the terminating nul
*/
} while (strlen(string) > 0 && string[strlen(string) - 1] != '\n');
此循环将清除第一个换行符之前的输入,还允许您显式处理(如果需要,则丢弃)所有接收到的输入。因此,没有必要对getchar()
使用第二个循环。
您还没有检查fgets()
是否返回NULL
,因此I也没有。建议您检查一下,因为这样可以在输入时指出错误。
https://stackoverflow.com/questions/51227542
复制相似问题