我的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);