为什么在特定行中使用 getchar?

Why use getchar in specific line?

如果第 5 行的 getchar() 没有使用,为什么下面的代码会在一轮后终止?

char s;
while(1){
    printf("Enter two integers: ");
    scanf("%d%d",&a,&b);
    getchar();
    c = a + b;
    printf("Addition of %d & %d is %d\n",a,b,c);
    printf("Add more numbers(yes/no): ");
    scanf("%c",&s);
    if(s == 'y')
        continue;
    else
        break;
}

为什么在以下代码中使用字符串不起作用?我已经包含了 文件。

char s[10];
while(1){
    printf("Enter two integers: ");
    scanf("%d%d",&a,&b);
    getchar();
    c = a + b;
    printf("Addition of %d & %d is %d\n",a,b,c);
    printf("Add more numbers(yes/no): ");
    scanf("%s",s);
    if(s == "yes")
        continue;
    else
        break;
}

当您输入第一个 scanf("%d%d",&a,&b) 时,您可能用 Enter 键结束了输入。

Enter 键作为换行符添加到 scanf 从中读取的输入缓冲区。

如果您没有 getchar() 调用,那么下一个 scanf("%c",&s) 将读取换行符。

如您所述,一种解决方案是使用 getchar() 读取并丢弃换行符。另一个解决方案是让 scanf 做同样的事情:

scanf(" %c",&s);
//     ^
// Note the space here!

前导 space 告诉 scanf 跳过并忽略所有前导的白色-space 字符,其中换行符就是一个这样的字符。

请注意,scanf 的大多数格式说明符会自动跳过并忽略前导白色-space。例如 %s 会这样做,这意味着你的第二个版本 scanf("%s",s) 不需要 getchar() 调用。

另请注意,通过在调试器中花五分钟逐个语句单步执行代码,同时监视变量及其值,应该可以轻松推断出这一点。


然后 s == "yes"。这里发生的是数组 s 将衰减为指向其第一个元素的指针,文字字符串也是如此,然后您比较这些指针以查看它们是否相同,而它们很可能永远不会相同。

它有点简化,等同于:

char yes_literal[4] = "yes";
if (&s[0] == &yes_literal[0]) ...