我正在尝试从用户读取包括空格在内的整行,但是现在我的代码仅在for循环的第一次迭代中才正确执行scanf。之后,它仅打印x 9次,而不是再次询问用户更多的输入。好像在随后的迭代中没有调用scanf,为什么?我怎样才能解决这个问题?我的代码如下。谢谢
#include <stdio.h>
#include <stdlib.h>
int main(){
char x[1024];
for (int n=0; n<10; n++){
scanf("%[^\n]s",x);
printf("x = %s\n",x);
}
答案 0 :(得分:7)
The scanf
family has myriad problems,包括将项目保留在缓冲区中,然后它将继续重新读取。那就是你正在发生的事情。如果您不需要使用它,请不要使用它。
使用fgets
读取整行。然后,如果要解析该行,请进一步使用sscanf
。
char line[BUFSIZ];
while( fgets(line, sizeof(line), stdin) != NULL ) {
...
}
答案 1 :(得分:5)
scanf("%[^\n]s",x)
读取除\n
以外的所有内容。这意味着在第一次读取之后,它将\n
保留在缓冲区中,这样每次连续读取都不会读取任何内容(这就是x
保持原样的原因)。
对于在线阅读(即对\n
进行正确处理),通常更适合使用fgets
。而且,当您想摆脱\n
字符(将成为fgets
读取的字符串的一部分)时,可以使用strcspn
函数:
int main(){
char x[1024];
for (int n=0; n<10; n++){
if (!fgets(x,1024,stdin)) {
break;
}
x[strcspn(x,"\n")]='\0';
printf("x = %s\n",x);
}
}