scanf()未返回正确的值?
我有一个功能,作为一个更大计划的一部分,以确定前一周每天销售的产品数量。以下是执行案例切换的功能:scanf()未返回正确的值?,c,C,我有一个功能,作为一个更大计划的一部分,以确定前一周每天销售的产品数量。以下是执行案例切换的功能: unsigned int switchfn() { int productNumber; // product 1 through 5 // only while product 1 through 5 is being entered. while ((scanf("%d", &productNumber)) != EOF) { // gather product da
unsigned int switchfn()
{
int productNumber; // product 1 through 5
// only while product 1 through 5 is being entered.
while ((scanf("%d", &productNumber)) != EOF) {
// gather product data
switch (productNumber) {
case '1': // product one
++productOne;
break;
case '2': // product two
++productTwo;
break;
case '3': // product three
++productThree;
break;
case '4': // product four
++productFour;
break;
case '5': // product five
++productFive;
break;
case '\n': // ignore new line
case '\t': // ignore tab
case ' ': // ignore space
break;
default: // catch all other characters
printf("%s", "No such product exists.");
puts(" Please enter a valid product number.");
break;
}
}
return 0;
}
但是,当程序运行时,它总是跳转到默认值,即使在输入数字1到5时也是如此。这是scanf()返回的内容的问题吗?您似乎对整数和ASCII数字感到困惑。您正在执行格式化提取,但检查
productNumber
,就好像它是在输入中找到的实际ASCII字符一样
记住
由于您也希望涵盖像
'\n'
这样的情况,请改为使用%c
读入字符。然后提取操作将不会像现在那样为您执行格式转换,您的字符文字比较将是正确的。由于您的scanf
函数引用的是整数,您只需将大小写切换为整数:
case 1:
//your logic
break;
case 2:
//your logic
break;
案例“1”-此时您要求编译器检查您是否输入了字符“1”-其ASCII值为49,这就是他跳过默认案例的原因。尝试输入“%c”scanf(“%d”,&productNumber)获取productNumber是一个整数。
但是case'1':'1'是一个字符,他的ASCII值是49,所以每次你输入一个整数时,没有匹配的case,只是跳转到默认case。您可以输入“%c”来获取字符。您应该选中==1
,而不是!=EOF
。如果输入的不是数字,则函数可能返回0
。当您有10个以上的产品时,您打算怎么做?@M.M:您的意思是,像'\n'
,'\t'
和'
?@LightnessRacesinOrbit%d
这样的输入将跳过这些characters@M.M:是的。这就是问题所在。这就是为什么解决方案是改变%d
,而不是改变与scanf
比较的内容。这正是我的观点。很高兴你收到了。:)我在12小时前就说过了。有几个人已经说过了。您的回答似乎没有添加任何信息。此外,请写正确的英语,这不是写得像dis u no INIT m8