我遇到了Selection
的问题,因为它在fgets
输入后第一次进入\n
循环时返回while
。
由于我已经在k
循环内部并且已经编写了while
,我该如何处理?
#1 try
答案 0 :(得分:4)
在调用LgnArr3[s]
之后,输入中有换行符,第一次调用scanf()
会读取该换行符。 fgets()
在遇到换行符fgets()
时停止阅读输入。因此,它不会读取任何输入。
在\n
之后立即拨打getchar();
来使用换行符。
如果输入中有多个字符,您也可以使用循环来消费。
scanf()
通常,最好避免将int c;
while((c= getchar()) != '\n' && c != EOF);
与scanf()
混合。您可以使用fgets()
代替fgets()
,并使用不太倾向的scanf()
来解析该行。
答案 1 :(得分:1)
你应该清理stdin的缓冲区。您可以在循环之前使用fflush(stdin);
执行此操作。但这是一种糟糕的风格。还要考虑fseek(stdin,0,SEEK_END);
。
答案 2 :(得分:1)
您只需在格式后添加空格即可使用\n
scanf("%c ", &r);
答案 3 :(得分:1)
我遇到了fgets的问题,因为它在第一次进入“k”输入后的while循环时返回\ n。
这是因为当您输入scanf("%c", &r);
时,k[ENTER_KEY]
会将k
字符存储在变量r
中,并将\n
(按下了ENTER键)保存在stdin
流。
因此对于fgets(inputline, 160, stdin);
,它会在\n
中找到stdin
换行符,在inputline
中找到它并从man -s3 fgets
退出:
fgets()从流中读取最多一个小于大小的字符,并将它们存储到s指向的缓冲区中。读数在EOF或换行符后停止。如果读取换行符,则将其存储到缓冲区中。
由于我已经在while循环内部并且已经编写了“#1 try”,我该如何处理?
您可以使用\n
stdin
中使用getchar()
{}
醇>