2015-02-09 73 views
-3

好吧,我正在做一個班級的任務,在這個班級中,我必須讀取電阻上的4個色帶並確定其電阻值。爲了做到這一點,我編寫了代碼,首先要求用戶輸入相應於特定樂隊顏色的字母。例如R對應於紅色。這裏是我寫的代碼:掃描碼不起作用

char band1, band2, band3, band4; 
float firstband, secondband, thirdband, fourthband; 
float value1, value2, value3, value4, finvalue; 
printf("Please enter the 1st band: "); 
scanf("%c", &band1); 
printf("Please enter the 2nd band: "); 
scanf("%c", &band2); 
printf("Please enter the 3rd band: "); 
scanf("%c", &band3); 
printf("Please enter the 4th band: "); 
scanf("%c", &band4); 

問題是,當用戶被要求輸入字母時,請求會混亂起來。它給了我這樣的:

請輸入第一個樂隊:

請輸入第二個波段:請進入第三個波段:

請進入第四區段:阻力是...

只有第一帶值和第三帶值被讀取,第二和第四被跳過。我似乎無法找到代碼中的錯誤。

+0

噢,非常感謝你!它現在有效。 – 2015-02-09 21:56:00

+2

出於好奇,你如何區分黑色,棕色,藍色,綠色和灰色? – Wintermute 2015-02-09 21:59:33

+2

代碼提示「請輸入第一個樂隊:」。用戶輸入'R'(紅色),然後輸入回車鍵或'\ n''。 'scanf(「%c」,&band1);'讀取''R'和'scanf(「%c」,&band2);'讀取''\ n''。鍵入2個鍵。 2鍵讀取。 「第二次和第四次被跳過」並非如此。只是代碼讀入'band2'的''\ n'。 – chux 2015-02-09 22:09:13

回答

1

您沒有做任何錯誤檢查或輸入清除。結果,下一個scanf調用「吃掉」來自前一個字符的無效字符,導致看起來被「跳過」。

爲了解決這個問題,你可以使用下面的函數來清除輸入緩衝區(這是什麼scanf從第一讀取):

void clear_input() { 
    int ch = 0; 
    while((ch = getchar) != '\n' && ch != '\0' && ch != EOF); 
} 

而且,這是一個好主意,讓成習慣檢查scanf的返回值;這確保了有效的輸入端爲:

int check = -1; 
do { 
    check = scanf("%c", &variable); 
    clear_input(); 
} while (check != 1); 

scanf的選擇,如果你只需要一個字符可能是使用getchar(void)getchar()從用戶獲取單個字符並返回該字符的值。即使你走這條路,你仍然必須清除輸入緩衝區。

3

您正在餵養scanf參考單個char變量。你似乎想要輸入字符串,它是char的數組。

是這樣的:

char aString[20]; 

printf("Enter a string, no more than 19 characters: "); 
scanf("%s", aString); 

它說:「不超過19個字符」因爲在C字符串是空終止的。

然而,這只是用簡單的方式來理解。但它很容易出錯。正如評論中指出的那樣,這將更加強大:

if (1 != scanf("%19s", aString)) 
{ 
    Handle_problem(); 
} 
+0

不,我需要字符,因爲我之後使用了switch語句來確定與用戶輸入的字母對應的值。 – 2015-02-09 21:58:43

+3

所以......你沒有給我們足夠的信息來幫助。從你發佈你需要的代碼來看,這是非常不清楚的。 – Almo 2015-02-09 22:00:01

+0

對不起,我以爲我寫的很清楚。 – 2015-02-09 22:04:34