【问题标题】:Having trouble with do while loops in C在 C 中使用 do while 循环时遇到问题
【发布时间】:2011-10-07 18:46:38
【问题描述】:

我是 C 的初学者,我正在编写一个将美元转换为欧元的基本程序。由于某种原因,程序没有运行这一行:"scanf("%c", &yn);"。如果我删除 do while 循环,程序可以正常工作。

循环不会停止并等待用户输入“y”或“n”,而是重新开始并再次询问美元金额。

#include<stdio.h>

main()

{
    float usd = 0.00;
    float euro = 0.00;
    char yn;
    const float conversion = 0.75;

    do {
        /*get amount to convert*/
        printf("Please enter the amount of USD you want to convert to Euros: ");
        scanf("%f", &usd);

        /*convert amount*/
        euro = (usd * conversion);

        /*output results and ask to continue*/
        printf("\n%.2f USD equals %.2f Euros. Do you want to convert another amount? (y/n): ", usd, euro);
        scanf("%c", &yn);
        printf("\n");


        /*if yes, get new amount to convert. if no, program ends*/
    } while (yn = 'y');

    return 0;
}

提前致谢。

【问题讨论】:

  • 是什么让你说“程序没有运行这一行”?它最肯定正在运行那条线。也许您应该打印来自scanf 的返回值,以及写入yn 的值以确定发生了什么。 (提示:yn 将等于 '\n'。)

标签: c loops scanf


【解决方案1】:
do {
  // ...
} while( yn == 'y'); // At this statement you are making an assignment,
                     // not comparison. Use the equal to operator.

【讨论】:

  • 这只是它循环并再次提示输入美元的原因。主要问题是程序甚至不提示输入“y”“n”字符。
【解决方案2】:

您的 scanf 正在从先前读取的浮动中获取换行符。您需要考虑新行,scanf(" %c", &amp;yn); 应该可以工作。即使您输入“y”或“n”,评估也会失败,因为您将 'y' 分配给 yn,这将始终评估为 true .将其更改为while( yn == 'y')

【讨论】:

    【解决方案3】:

    您需要将yn = 'y' 更改为yn == 'y'。在第一种情况下,您 yn 设置为'y',而您想要做的是比较 它与'y'== 运算符用于比较。

    【讨论】:

      【解决方案4】:

      您的本意是在您的 while 条件下执行 ==,而不是单个 =,这将始终如实评估。

      【讨论】:

        【解决方案5】:

        %c 之前的第二个scanf 中留一个空格,例如scanf(" %c", &amp;yn);

        也通过这个问题,非常类似于你的问题:

        Noticing strange behavior with strings in c

        也有人指出:

        while (yn = 'y'); 将是 (yn == 'y')

        【讨论】:

          【解决方案6】:

          while (yn = 'y') 应该是 while (yn == 'y')

          【讨论】:

            【解决方案7】:

            您可能已经注意到并理解了这个愚蠢的错误,但是,这是一个非常常见的错误,而且很难追踪,因为赋值操作总是返回正确的赋值值。有两种方法可以最大程度地减少出现此类错误的机会。第一种是使用#define equals =。 另一个是两个总是替换比较的顺序。所以yn == 'y' 将变为'y' == yn。这样,如果错误地将 == 替换为 =,则会出现编译错误。 我不知道一个人没有偶然发现这个错误......

            【讨论】:

              【解决方案8】:

              正如其他人所指出的,问题在于您不小心写了一个赋值语句而不是相等测试。我们都这样做了。

              但附带说明一下,作为初级 C 程序员,您可能会遇到一些建议,告诉您在相等测试中切换操作数的顺序(如果您犯同样的错误,这将导致编译错误),或者 #define EQUALS(或者,在相关主题上,TRUE 和 FALSE)。这是一个非常糟糕的建议。

              颠倒操作数的顺序会使代码更难阅读,因为您实际上不想将常量与变量进行比较,而是将变量与常量进行比较。 (此外,如果您比较两个变量,它根本无济于事。)使用#defines 还会用不相关的废话混淆代码。 C 中没有布尔数据类型,C 确实有类似命名的赋值和相等运算符。

              更好的建议是学习语言,而不是试图让它看起来不像。

              【讨论】:

              • 我不是反对者,虽然您对#defines 的看法是正确的,但您不将常数放在左侧进行比较是错误的。 = 与 == 问题是 c 中的可用性问题,可用性问题在各个层面上都是真实存在的。即使对于像你这样的专家也是如此。习惯在语言的可用性中“围绕”这个“错误”进行编码。诚然,它不适用于变量,但这是一个“几率”的事情,给自己更大的成功几率==通常在生活的任何角落都是一个非常好的主意。假装你是无懈可击的不是。尤其是当您可以解决您所知道的正确性时
              • 好吧,这不是一场辩论,所以我不会重复我以前的内容,但我会补充一点,这类问题是为什么会有编译器警告:gcc -Wall will catch 'if (c = 1)'嫌疑人。然后我们当然会遇到“编译器给出太多警告,所以我把它们关掉”的事情,这对我来说相当于医生说“X 光片显示太多骨折,所以我忽略了它并给了病人一个创可贴。”就良好的编码习惯而言,使用警告编译远比编写反向表达式要好得多。
              • 不能同意更多关于警告,说得好。现在,我的腿在所有错误的地方弯曲......
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-06-02
              相关资源
              最近更新 更多