2015-10-25 177 views
-1

我有一個功能,作爲一個更大的程序的一部分,以確定在前一週的每一天銷售的產品數量。這裏是執行的情況下切換功能:scanf()沒有返回正確的值?

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; 
} 

然而,當程序運行時,它總是跳轉到默認,甚至通過5.輸入數字1時,這是一個問題,什麼scanf()函數將返回?

+0

您應該檢查'== 1',而不是'!= EOF'。如果輸入的數字不是數字,該函數可能返回'0'。 –

+0

一旦你有超過10種產品,你會怎麼做? –

+0

@ M.M:你的意思是,輸入像''\ n'',''\ t''和''''? –

回答

0

您似乎在整數和ASCII數字之間感到困惑。您正在執行格式化的提取,但檢查productNumber就好像它是在輸入中找到的實際ASCII字符。

請記住,'1' is actually 49

既然您想要覆蓋像'\n'這樣的案例,請改爲使用%c代替char。然後提取操作不會像現在這樣執行格式轉換,並且字符文字比較將是正確的。

0

由於您scanf功能被引用的整數,你只是有你的情況下切換到整數:

case 1: 
//your logic 
break; 
case 2: 
//your logic 
break; 
0

案例「1」 - 在這一刻你是問編譯器檢查你輸入一個字符「 1' - 他的ASCII值是49,這就是他跳到默認情況下的原因。嘗試輸入「%c」

+0

我說那十二個小時前。 –

0

scanf(「%d」,& productNumber)get productNumber是一個整數。 但是'1':'1'是一個字符,他的ASCII值是49,所以每次輸入一個整數時,都沒有匹配的情況下跳到默認情況。你可以輸入「%c」來獲得一個字符。

+0

有幾個人已經這樣說過了。您的答案似乎沒有添加任何信息。另外,請寫出適當的英語,這不是寫不喜歡m8 –