以下是我的源代码。读完整数后,程序应该等到我键入一个字符串然后按回车键。但是,只要我输入整数,程序就会退出。你能告诉我我的错吗?
#include <stdio.h>
#include <string.h>
int main()
{
int n;
char command[255];
scanf("%d", &n);
fgets(command, 255, stdin);
return 0;
}
我提到我也尝试使用gets(command)
,但我得到的结果相同。
答案 0 :(得分:7)
有一个尾随换行符,因为你在整数后按 ENTER 。通过改变它来吃它:
scanf("%d", &n);
到此:
scanf("%d ", &n); // this will eat trailing newline
正如chux所说,scanf("%d ", &n)
将不会返回,直到用户输入数字和一些非白色空格。
相关问题:C: Multiple scanf's, when I enter in a value for one scanf it skips the second scanf
另外,我想到了我的例子:Caution when reading char with scanf。
另外,正如Marco所说,您可以使用:scanf("%d\n", &n);
,专门针对换行符。
还有这种可能性:
#include <stdio.h>
#include <string.h>
int main()
{
int n;
char command[255], newline;
scanf("%d", &n);
scanf("%c", &newline); // eat trailing newline
fgets(command, 255, stdin);
return 0;
}
但是,我个人会使用两个fgets()
而不是scanf()
。 :)
答案 1 :(得分:2)
scanf()
在整数后留下换行符,fgets()
将读取并退出。
尝试使用fgets()
阅读所有输入。
#include <stdio.h>
#include <string.h>
int main()
{
char buffer[255];
int n;
char command[255];
fgets(buffer, sizeof(buffer), stdin);
sscanf(buffer, "%d", &n);
fgets(command, sizeof(command), stdin);
return 0;
}
答案 2 :(得分:1)
键入"3c"
并在控制台中按Enter将使输入缓冲区stdin
看起来像这样:{'3','c','\n'}
并且可以正常工作,因为scanf消耗3,fgets消耗{{1} } {} c
将在\n
停止的位置。
但是如果你输入“3”然后按回车键,scanf将消耗3,并且换行字符将被保留,导致fgets不消耗任何字符。