读取整数后,C无法读取字符串

读取整数后,C无法读取字符串,c,string,C,String,下面是我的源代码。在我读取整数后,程序应该等到我键入一个字符串,然后按enter键。但是,只要输入整数,程序就会退出。你能告诉我哪里是我的错吗 #include <stdio.h> #include <string.h> int main() { int n; char command[255]; scanf("%d", &n); fgets(command, 255, stdin); return 0; } #

下面是我的源代码。在我读取整数后,程序应该等到我键入一个字符串,然后按enter键。但是,只要输入整数,程序就会退出。你能告诉我哪里是我的错吗

#include <stdio.h>

#include <string.h>

int main()
{

    int n;
    char command[255];

    scanf("%d", &n);
    fgets(command, 255, stdin);

    return 0;
}
#包括
#包括
int main()
{
int n;
char命令[255];
scanf(“%d”和“&n”);
fgets(命令,255,标准输入);
返回0;
}

我提到我也尝试使用了
gets(command)
,但是我得到了相同的结果。

有一个尾随的换行符,因为在整数之后按ENTER键。通过改变这个来吃它:

scanf("%d", &n);
为此:

scanf("%d ", &n); // this will eat trailing newline
正如chux所说,
scanf(“%d”和&n)
将不会返回,直到用户输入数字和后面的一些非空白


有关问题:

我还想到了我的例子:

此外,正如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;
}
#包括
#包括
int main()
{
int n;
char命令[255],换行符;
scanf(“%d”和“&n”);
scanf(“%c”,&newline);//吃尾随的换行符
fgets(命令,255,标准输入);
返回0;
}

但是,我个人会使用两个
fgets()
和no
scanf()
:)

scanf()
在整数后保留换行符,
fgets()
将读取并退出

尝试使用
fgets()
读取所有输入

#包括
#包括
int main()
{
字符缓冲区[255];
int n;
char命令[255];
fgets(缓冲区、sizeof(缓冲区)、stdin);
sscanf(缓冲区、%d、&n);
fgets(command,sizeof(command),stdin);
返回0;
}
在控制台中键入
“3c”
并按enter键将使您的输入缓冲区
stdin
如下所示:
{'3'、'c'、'\n'}
将起作用,因为scanf使用3,fgets使用
c
,而
\n
将在
fgets
停止的地方


但是,如果键入“3”并按enter键,scanf将使用3,换行符将保留,导致FGET不使用任何字符。

scanf不使用换行符'\n',FGET将停止在该位置。还有为什么不
scanf(“%d\n”,&n)?看起来更清晰。这也适用于@MarcoBonelli,grazie.
scanf(“%d,&n”)
将不会返回,直到用户输入数字和一些非空白。这是真的@chux,我更新了答案,如果您认为我们可以进一步改进,请让我知道。对于学习者代码,现在就可以了。
scanf(“%d”和&n)
的基本问题是,在许多SO帖子中,尾随的
会导致问题。最后,
scanf()
是一个薄弱环节,与
fgets()
混合使用肯定有问题。我会使用2个
fgets()
调用,但它所帮助的问题可能远远超出了本文的范围。在第一个场景中,输入缓冲区将是
{'3','c','\n'}
,对吗?我想你不小心输入了“d”而不是“c”?@Polb-yah,很抱歉,是的最好不要将
scanf()
fgets()
混合使用(最好不要使用
scanf()
,因为这个答案没有)。
#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;
}