使用scanf读取带空格的字符串?
我希望下面的内容请求输入,然后输入一个字符串(带空格),然后再执行一次。但在输入第一个字符串后,它会重复输出“input$”使用scanf读取带空格的字符串?,c,string,scanf,C,String,Scanf,我希望下面的内容请求输入,然后输入一个字符串(带空格),然后再执行一次。但在输入第一个字符串后,它会重复输出“input$” char command[80]; while(1) { printf("input$ "); scanf("%[^\n]", command); } 我的输出:nput$input$input$input$input$input$input$input$input$input$input$input$input
char command[80];
while(1)
{
printf("input$ ");
scanf("%[^\n]", command);
}
我的输出:nput$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input$input输入$input$input$input$input$input$input$input$^C
我想要的是:
input$ hi
input$ this can take spaces
input$
试试这个:
char command[80];
while(1)
{
printf("input$ ");
fgets(command, 80, stdin);
}
您通常希望使用以下内容:
char command[80];
while(1)
{
printf("input$ ");
scanf("%79[^\n]%*c", command);
}
“79”防止缓冲区溢出,%*c
使用输入缓冲区中的新行。它有一个小缺点:即使输入缓冲区中的下一个字符不是新行,它仍然会消耗(并丢弃)一个字符。如果必须处理这种可能性,可以读取它并忽略它,除非命令
缓冲区已满:
char ignore;
scanf("%79[^\n]%c", command, &ignore);
if (strlen(command) == 79)
// `ignore` probably shouldn't be ignored after all
你最好避免使用
scanf
。问题是,一旦您读取到第一个换行符,下一个字符就是换行符,因此scanf()
报告它无法转换任何内容(返回值0,而不是EOF),但您却轻松地忽略了它。您必须阅读换行符(getchar()
),才能让它继续。或者在]
之后添加一个\n
;或者,实际上,一个空间就可以了。如果不关心前导空格,则%
前面的空格也可以。正确使用scanf()
函数非常困难;让初学者使用它们真的是“残酷而不寻常的惩罚”。我支持杰瑞。我认为这是个坏建议。@Lucas:看。请注意,更新后的答案(使用fgets
)没有问题。+1完美@OP查看scanf(man scanf)的文档,它值得一读——它是一个比你想象的功能强大得多的函数。当代码1)读取以'\n“
2”开头的行时,会出现问题。如前所述,即使它不是'\n'
也会消耗第80个字符,而%79[^\n]]*1[/n]“