我试图从用户读取整行,包括空格,但是我的代码现在只在for循环的第一次迭代中正确地执行scanf.之后,它只需打印x次,而不是再次要求用户输入更多信息.就好像在后续迭代中没有调用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);
}
Run Code Online (Sandbox Code Playgroud)
这个scanf家庭有很多问题,包括将物品留在缓冲区中,然后继续重新阅读.这就是发生在你身上的事.如果您不需要使用它,请不要使用它.
使用fgets读整行.然后如果你想解析该行进一步使用sscanf.
char line[BUFSIZ];
while( fgets(line, sizeof(line), stdin) != NULL ) {
...
}
Run Code Online (Sandbox Code Playgroud)
scanf("%[^\n]s",x)读取除a之外的所有内容\n.这意味着在第一次读取之后,它将离开\n缓冲区,这样每次连续读取都不会读取任何内容(这就是为什么x保持原样).
对于阅读行(即正确处理\n),fgets通常更适合.当你想摆脱\n-character(它将成为读入的字符串的一部分fgets)时,你可以使用strcspn-function:
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);
}
}
Run Code Online (Sandbox Code Playgroud)