使用c

时间:2018-09-10 20:38:52

标签: c

我正在尝试从用户读取包括空格在内的整行,但是现在我的代码仅在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);
    }

2 个答案:

答案 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);
    }
}