使用c读取包括空格在内的整行

fre*_*red 1 c

我试图从用户读取整行,包括空格,但是我的代码现在只在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)

Sch*_*ern 7

这个scanf家庭有很多问题,包括将物品留在缓冲区中,然后继续重新阅读.这就是发生在你身上的事.如果您不需要使用它,请不要使用它.

使用fgets读整行.然后如果你想解析该行进一步使用sscanf.

char line[BUFSIZ];
while( fgets(line, sizeof(line), stdin) != NULL ) {
    ...
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*ner 5

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)

  • 一定要检查`fgets`是否成功. (2认同)