我的C do while循环不会执行

时间:2014-02-12 23:54:15

标签: c while-loop do-while

我的程序分配是编写一个循环程序,计算USD到欧元。我的代码看起来像这样

#include <stdio.h>


int main(void)

{
    double USD, euro;
    char again;

    do
    {
    printf("Please enter the amount of USD you want to convert to Euros> ");
    scanf_s("%lf", &USD);

    euro=USD * 0.73209;

    printf("%4.2f USD equals %4.2f Euros.", USD, euro);
    printf("Do you want to convert another amount (y/n)?");
    scanf_s("%c", &again);
    }

    while (again == 'y' || again == 'Y');


    return 0;
}

当我运行程序时,它会执行,允许我输入一个美元值,给我正确的欧元值,然后当提示y / n时它就会退出。

6 个答案:

答案 0 :(得分:1)

正如其他人所解释的那样,您的问题是由于STDIN中仍有\n

为了跳过它,只需替换

scanf_s("%c", &again);

scanf_s(" %c", &again);

这是scanf功能的一部分:

  

空白字符:空白('');标签('\ t');或换行符('\ n')。空格字符会导致scanf读取但不存储输入中的所有连续空白字符,直到下一个非空白字符。格式中的一个空白字符与输入中的任何数字(包括0)和空白字符组合相匹配。

     

http://msdn.microsoft.com/en-us/library/kwwtf9ch.aspx

第一个scanf

scanf(" %lf", &USD);

也可以提供帮助。

答案 1 :(得分:0)

这是因为输入流(stdin)中存在杂散的\ r和\或\ n,由scanf读取并退出do,用

替换scanf_s行
while((again = getchar()) != '\n' && again != EOF);

如果您想使用scanf_s,那么您可以执行类似

的操作
do {scanf_s("%c", &again);}while(again == '\n' || again == '\r');

有关此检查的更多信息http://c-faq.com/stdio/gets_flush2.html

答案 2 :(得分:0)

我认为你必须在这里使用strcmp()。

while ( strcmp(again, 'y') == 0 || strcmp(again, 'Y') == 0 )

我在学习C大约两周时很抱歉,如果它不起作用!

答案 3 :(得分:0)

试试这个。

#include <stdio.h>


int main(void)

{
    double USD, euro;
    char again;

    do
    {
        printf("Please enter the amount of USD you want to convert to Euros> ");
        scanf_s("%lf", &USD);
        getchar();
        euro=USD * 0.73209;

        printf("%4.2f USD equals %4.2f Euros.", USD, euro);
        printf("Do you want to convert another amount (y/n)?");
        again = getchar();
    }
    while (again == 'y' || again == 'Y');
    return 0;
}

这是因为scanf不占用空白字符。如换行,空格等,当你按下输入'美元'正在取值并且'再次'取得换行符。希望这可以帮助。 :)

答案 4 :(得分:0)

stdin(标准输入)还有一个你缺少的角色,就在你要求获得美元金额之后,这个角色并不简单,事实上它等着你拉它out,这就是你对上一个scanf的所作所为。发生这种情况是因为您告诉scanf(第一个)只读取float(双)数字而不是其他内容。

要查看正在发生的事情,您可以检查变量again的值,如indiv所说。虽然最好打印ASCII值而不是字符本身,因为您可能无法确切知道它是空格,新行,制表符还是此类任何其他字符。

而不是试试这个:

printf("ASCII: %d, CHAR: %c\n", again, again);

将该行放在最后scanf之后。

无论哪种方式,你的问题是找到一种方法来丢弃最后一个角色。一种解决方案是从stdin读取字符串,然后使用atof()将该字符串转换为十进制数字。

答案 5 :(得分:0)

更改

scanf_s("%c", &again);

scanf_s("%c", &again, 1);