C:scanf上的循环

C:scanf上的循环,c,scanf,C,Scanf,对于我的scanf,我想占用空间。但是,如果我运行这部分代码,“Enter message:”将处于无限循环中 如果我仅将scanf更改为“%s”,则它可以正常工作,但我无法接受中间有空格的输入 有人能帮我找出它是如何抛出无限循环的,或者有什么办法来解决这个问题吗?scanf()读一行有太多方法出错。使用fgets() 不要使用fflush(stdin),这是未定义的行为为什么要使用write和fwrite?我想换行符会留在缓冲区中,因此后续调用scanf读取零字符。@user3121023完美

对于我的scanf,我想占用空间。但是,如果我运行这部分代码,“Enter message:”将处于无限循环中

如果我仅将scanf更改为“%s”,则它可以正常工作,但我无法接受中间有空格的输入

有人能帮我找出它是如何抛出无限循环的,或者有什么办法来解决这个问题吗?

scanf()
读一行有太多方法出错。使用
fgets()


不要使用
fflush(stdin)
,这是未定义的行为为什么要使用
write
fwrite
?我想换行符会留在缓冲区中,因此后续调用
scanf
读取零字符。@user3121023完美的解决方案是
fgets()
fflush(stdin)
与某些平台/编译器配合使用以刷新
stdin
。然而,C标准没有规定这一点,而是未定义的行为。它不是便携式的。
    char buf[1024] = {0};

    // send a message
    if(status == 0) {
        while(1) {
            printf("Enter message : ");
            scanf("%1023[^\n]", buf);
            fflush(stdin);
            if(strcmp(buf,"quit")==0)
                break;
            status = write(s, buf, strlen(buf));
            fflush(stdout);
            memset(buf,0,sizeof buf);
        }
    }
char buf[1024] = {0};

// send a message
if(status == 0) {
    while(1) {
        printf("Enter message : ");
        if (fgets(buf, sizeof buf, stdin) == NULL) break;
        //scanf("%1023[^\n]", buf);
        //fflush(stdin);

        buf[strcspn(buf, "\n")] = '\0'; // lop off potential \n

        if(strcmp(buf,"quit")==0)
            break;


        status = write(s, buf, strlen(buf));
        // fflush(stdout);
        memset(buf,0,sizeof buf);
    }
}