我的C do while循环将不会执行

我的C do while循环将不会执行,c,while-loop,do-while,C,While Loop,Do While,我的程序任务是编写一个循环程序,计算美元到欧元。我的代码如下所示 #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=

我的程序任务是编写一个循环程序,计算美元到欧元。我的代码如下所示

#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;
}
#包括
内部主(空)
{
双美元,欧元;
再次烧焦;
做
{
printf(“请输入要转换为欧元的美元金额>”;
扫描单位(“%lf”和美元);
欧元=美元*0.73209;
printf(“%4.2f美元等于%4.2f欧元。”,美元,欧元);
printf(“是否要转换其他金额(y/n)?”;
scanf_s(“%c”&再次);
}
while(再次='y'| |再次='y');
返回0;
}

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

这是因为在输入流(stdin)中还有游离的\r和\r和\n,由scanf读取并退出do,而将scanf\u行替换为

while((again = getchar()) != '\n' && again != EOF);
如果您想使用scanf_,那么您可以执行以下操作

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

有关此检查的更多信息,我认为您必须在此处使用strcmp()

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

试试这个

#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;
}
#包括
内部主(空)
{
双美元,欧元;
再次烧焦;
做
{
printf(“请输入要转换为欧元的美元金额>”;
扫描单位(“%lf”和美元);
getchar();
欧元=美元*0.73209;
printf(“%4.2f美元等于%4.2f欧元。”,美元,欧元);
printf(“是否要转换其他金额(y/n)?”;
再次=getchar();
}
while(再次='y'| |再次='y');
返回0;
}
这是因为scanf不接受空格字符。如换行符、空格等。当您按enter键时,“USD”取值,“再次”取换行符。希望这有帮助。:)

stdin
(标准输入)还有一个字符丢失,就在你索要美元金额后,这个字符并不简单,事实上它正在等待你取出,这就是你对最后一个
scanf
所做的。发生这种情况是因为您告诉scanf(第一个)只读取一个浮点数,而不读取其他任何数字

要查看发生了什么,您可以再次检查变量
的值,如indiv所说。尽管最好打印ASCII值而不是字符本身,因为您可能无法真正确定它是空格、新行、制表符还是任何其他此类字符

相反,请尝试以下方法:

printf("ASCII: %d, CHAR: %c\n", again, again);
将该行放在最后一个
scanf
后面


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

正如其他人所解释的,您的问题是由于
\n
仍保留在stdin中

要跳过它,只需替换

scanf_s("%c", &again);

这是scanf功能的一部分:

空白字符:空白(“”);制表符('\t');或换行符('\n')。空白字符使scanf读取但不存储输入中的所有连续空白字符,直到下一个非空白字符。格式中的一个空白字符与输入中的任意数字(包括0)和空白字符组合匹配

对于您的第一次
scanf

scanf(" %lf", &USD);
也可能有帮助。

改变

scanf_s("%c", &again);


您可能需要再次尝试打印
的值
。在这种情况下,它将有助于用字符包围它,以防它是空白(或者,比如,以前输入的换行符)<代码>printf(“再次:[%c]\n”,再次)我将在何处添加此内容?不要在Do语句或While语句中说“.另一个金额(y/n)”,让我们从逻辑上考虑一下。您想再次打印
的值
以查看
while
语句中测试的字符,对吗?您之所以想这样做,是因为您的
while
语句没有做您认为应该做的事情。所以在我看来,你应该遵循以下步骤:1。再次将值读入
。2.然后在
while
语句中测试之前将其打印出来。您建议的方法是再次打印
的值
,然后从用户处读取。我认为这行不通。不,
strcmp
用于比较
char
数组,也称为“C字符串”。在这种情况下,您需要再次比较单个
char
变量
,因此
=
就足够了。有些人使用fflush(stdin),根据c标准,它将具有“未定义的行为”,因此我不推荐它。
scanf(" %lf", &USD);
scanf_s("%c", &again);
scanf_s("%c", &again, 1);