C 循环代码不工作时(keepgoing='y')

C 循环代码不工作时(keepgoing='y'),c,loops,while-loop,scanf,C,Loops,While Loop,Scanf,所以我正在学习如何在C中使用while和for循环,但这段代码似乎不起作用。scanf语句似乎被忽略了,循环只是重复它自己,而不需要我输入“Y”让它重复。代码如下: void showCommission(); void main() { char keepGoing='y'; while(keepGoing=='y') { showCommission(); printf("Do you want to calculate another?\n

所以我正在学习如何在C中使用while和for循环,但这段代码似乎不起作用。scanf语句似乎被忽略了,循环只是重复它自己,而不需要我输入“Y”让它重复。代码如下:

void showCommission();

void main() {
    char keepGoing='y';
    while(keepGoing=='y') {
        showCommission();
        printf("Do you want to calculate another?\n");
        scanf("%c",&keepGoing);
   }
}

void showCommission() {
    float sales,commission;
    const float COM_RATE=0.10;
    printf("Enter the amount of sales\n");
    scanf("%f",&sales);
    commission=sales*COM_RATE;
    printf("The commission is $%f.\n",commission);
}
下面是运行代码给我的信息:

Enter the amount of sales                                                                         
5000                                                                                              
The commission is $500.000000.                                                                    
Do you want to calclulate another?    

...Program finished with exit code 10                                                             
Press ENTER to exit console.  

它从不提示我输入y,代码只是出于某种原因退出。

这是由于非字符输入留下的换行回车键。 扫描%f,&销售

例如,如果我输入500作为销售额,程序将读取500,\n,其中\n是您的输入键。但是,scanf%f和sales将只读取浮点值。因此\n是输入缓冲区中的剩余内容。然后,当程序尝试运行scanf%c并继续运行时,它将消耗剩余的\n,并将处理为按enter键并跳过输入

此问题可以通过使用剩余的\n来解决

void showCommission() {
float sales,commission;
char consumeNewLine;
const float COM_RATE=0.10;
printf("Enter the amount of sales\n");
scanf("%f",&sales);
scanf("%c",&consumeNewLine);
commission=sales*COM_RATE;
printf("The commission is $%f.\n",commission);
}

这是由于非字符输入留下的换行输入键击造成的。 扫描%f,&销售

例如,如果我输入500作为销售额,程序将读取500,\n,其中\n是您的输入键。但是,scanf%f和sales将只读取浮点值。因此\n是输入缓冲区中的剩余内容。然后,当程序尝试运行scanf%c并继续运行时,它将消耗剩余的\n,并将处理为按enter键并跳过输入

此问题可以通过使用剩余的\n来解决

void showCommission() {
float sales,commission;
char consumeNewLine;
const float COM_RATE=0.10;
printf("Enter the amount of sales\n");
scanf("%f",&sales);
scanf("%c",&consumeNewLine);
commission=sales*COM_RATE;
printf("The commission is $%f.\n",commission);
}

您遇到的问题是,调用scanf以使用%c格式读取值时,将接受换行符作为有效输入

这与scanf%f、&sales;调用读取一个浮点值,但不“使用”下面的换行符,将在输入缓冲区中保留该换行符,以便后续调用读取一个值以继续。因此,keepGoing的值不是y,程序将终止

有几种方法可以解决这个问题。最简单的方法可能是在%c字段前添加一个空格字符,这将指示scanf函数在“扫描”输入字符时跳过包括换行符在内的所有“空白”字符:

扫描%c,&keepGoing;//在%c之前添加的空格将跳过任何“剩余”换行符!
您遇到的问题是,调用scanf以使用%c格式读取值时,将接受换行符作为有效输入

这与scanf%f、&sales;调用读取一个浮点值,但不“使用”下面的换行符,将在输入缓冲区中保留该换行符,以便后续调用读取一个值以继续。因此,keepGoing的值不是y,程序将终止

有几种方法可以解决这个问题。最简单的方法可能是在%c字段前添加一个空格字符,这将指示scanf函数在“扫描”输入字符时跳过包括换行符在内的所有“空白”字符:

扫描%c,&keepGoing;//在%c之前添加的空格将跳过任何“剩余”换行符!
你有一些问题。首先,您需要检查scanf返回值;如果stdin在不提供y的情况下关闭,scanf将不断返回-1,而不重写keepGoing使循环无限

另一个问题是提前退出;%c禁止正常的scanf跳过空白的行为,因此您的主要scanf总是尝试读取您刚刚解析的用于填充sales的浮点后面的内容,通常是空白或某种换行,因此当您输入:

1.12
y
%c读取2后面的换行符,而不是y,循环立即退出

一个简单的解决办法是改变:

scanf("%c",&keepGoing);
致:


前导空格将重新启用跳过空格,以便在尝试读取下一个字符之前使用所有空格,并且每当它根本无法读取字符时,它将结束循环,而不是永远运行。可能应该为您的其他扫描添加类似的检查。

您有一些问题。首先,您需要检查scanf返回值;如果stdin在不提供y的情况下关闭,scanf将不断返回-1,而不重写keepGoing使循环无限

另一个问题是提前退出;%c禁止正常的scanf跳过空白的行为,因此您的主要scanf总是尝试读取您刚刚解析的用于填充sales的浮点后面的内容,通常是空白或某种换行,因此当您输入:

1.12
y
%c读取2后面的换行符,而不是y,循环立即退出

一个简单的解决办法是改变:

scanf("%c",&keepGoing);
致:

前导空格将重新启用跳过空格,以便在尝试读取下一个字符之前使用所有空格,并且每当它根本无法读取字符时,它将结束循环,而不是永远运行。可能应该为您的其他扫描添加类似的检查。

以查看i
f这有助于解释为什么会出现这个问题。OT:main的void return类型不符合标准。main的返回类型应为int。以查看它是否有助于解释您看到此问题的原因。OT:main的void返回类型不符合标准。main的返回类型应该是int。这根本不能回答问题。我的错。没有正确地阅读问题。用新答案编辑。这根本不能回答问题。我的错。没有正确地阅读问题。用新答案编辑。他还能读两个字。声明字符丢弃NL;然后扫描%c%c,&keepGoing,%discardNL@JoelTrauger:假设用户没有意外地在前一行输入一个小的尾随空格,或者双击enter或其他什么。跳过所有的空格,不管有多少,通常是更好的,当然,更好的是正确地验证输入,当浮点解析不起作用时丢弃行,强制输入继续只有y或n,当它不存在并且stdin没有达到EOF时重新编程,等等。他还可以读取两个字符。声明字符丢弃NL;然后扫描%c%c,&keepGoing,%discardNL@JoelTrauger:假设用户没有意外地在前一行输入一个小的尾随空格,或者双击enter或其他什么。跳过所有的空格,不管有多少,通常是更好的,当然,更好的是正确地验证输入,当浮点解析不起作用时丢弃行,强制输入继续只有y或n,当输入不起作用且stdin未达到EOF时重新编程,等等。。