【问题标题】:Why does this scanf in a while loop work?为什么这个scanf在while循环中起作用?
【发布时间】:2016-10-21 15:31:28
【问题描述】:

我不明白为什么这正是我想要的。我在循环中使用两个 scanf 的部分让我感到困惑。我使用 devcpp 编译它。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int dend, dsor, q, r;
    char c;
    while(c!='n')
    {
        printf("enter dividend: ");
        scanf("%d", &dend);
        printf("enter divisor: ");
        scanf("%d", &dsor);
        q=dend/dsor;
        r=dend%dsor;
        printf("quotient is %d\n", q);
        printf("remainder is %d\n", r);
        scanf("%c", &c);
        printf("continue? (y/n)\n");
        scanf("%c", &c);
    }
    system("PAUSE");
    return 0;
}

【问题讨论】:

  • do...while在哪里?
  • 这不是“解释我的代码”网站。你有什么问题?您是否阅读了函数的手册页?
  • 考虑在您完成提取 second 数字后,输入流中保留的尾随换行符发生了什么。一个调试器和一些单步操作可能会在这里起到很大的帮助。
  • 相关:to this question(和 数百 喜欢它)解决方案之所以有效,是为了避免您在此处使用的其他脆弱解决方案。例如,在输入第二个数字时,添加一个空格,然后按键盘上的 Enter 键,看看会发生什么。
  • 您可以并且可能应该在“继续”提示之后使用单个 scanf(" %c", &amp;c); 调用。前导空格读取换行符和前导空格等。您应该检查每个scanf(),以确保成功转换正确数量的值(if (scanf(…) == 1) 在每种情况下在此代码中恰好是正确的,但您应该检查预期值的数量)。

标签: c while-loop scanf


【解决方案1】:

FWIW,您的代码调用undefined behavior。在部分

char c;
while(c!='n')

c 是一个未初始化的具有自动存储功能的局部变量,您正在尝试使用不确定的 c 的值。

也就是说,第一个 scanf("%c", &amp;c); 用于吃掉输入缓冲区中出现的换行符,这是由于在上一次输入后按下回车键。 You can read about it in details in another post.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-16
    • 2016-07-23
    • 2023-02-11
    相关资源
    最近更新 更多