为什么我的“do while”循环在执行 printf 之前首先要求 getchar?

Why does my 'do while' loop first asks for getchar before executing printf?

提问人:ILoveYouAll 提问时间:9/17/2023 最后编辑:wohlstadILoveYouAll 更新时间:9/17/2023 访问量:62

问:

我是编程新手,并试图自学 C。但是,我遇到了一个我不知道如何解决的问题。这是我的简单程序。对不起,语法错误,英语是我的第二语言。

int main(){
    int x, confirmation;
    do{
        printf("\nTest Data: ");
        scanf("\n%d ", &x);
        printf("Do you want to stop? Y/N");
        confirmation = getchar();
       } while(confirmation != 'Y');

    return 0;
}

顺便说一句,这是在 Codeblocks 中。

当执行程序“测试数据:”时,很好,但首先它会要求,然后再执行第二个。除此之外,当我输入“Y”时,程序运行良好,但不能在执行第二个之前输入。scanfgetcharprintfprintf

喜欢这个:The Program

在使用之前,我使用过,但问题是一样的。我也试过循环。getcharscanf("%c",...)while

c while-loop scanf do-while getchar

评论

4赞 0___________ 9/17/2023
我建议放在字符串的末尾或调用os输出流是缓冲的\nfflush(stdout)
0赞 Some programmer dude 9/17/2023
scanf("\n%d ", &x);这里面不需要换行符。而且绝对不是尾随空间!尾随空格将等待更多非空格输入,然后返回并被执行。scanfprintf

答:

1赞 Ted Lyngmo 9/17/2023 #1

是因为它卡在了后面的空格中。删除该空格,然后阅读直到到达换行符。它可能看起来像这样:scanf%d

#include <ctype.h>
#include <stdio.h>

int main(void) {
    int x, confirmation;
    int ch;
    do {
        printf("\nTest Data: ");
        if (scanf("%d", &x) != 1) break;     // no \n or space
        printf("Do you want to stop? Y/N");

        // read until the newline:
        while((ch = getchar()) != EOF && ch != '\n') {}
        if (ch == EOF) break;

        confirmation = getchar();
    } while(toupper((unsigned char)confirmation) != 'Y');
}