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