我有這個程式,它讓用戶輸入一個數字串列,然后該程式在輸入中找到最大的數字,并計算輸入該最大數字的次數。
當我使用空格作為分隔符時,程式運行良好。但是當我使用逗號作為分隔符時,似乎存在邏輯錯誤。
這是我的源代碼:
int i, numberOfIntegers, listOfIntegers, largest = 0, occurrence = 0;
printf("\n \t \t \t Finding the LARGEST integer \n");
printf("\n How many integers do you want to enter? ");
scanf("%i", &numberOfIntegers);
printf("\n Input %i list of integers: \n ", numberOfIntegers);
for (i = 1; i <= numberOfIntegers; i )
{
printf("\t");
scanf("%i", &listOfIntegers);
if (listOfIntegers > largest)
{
largest = listOfIntegers;
occurrence = 1;
}
else if (listOfIntegers == largest)
{
occurrence ;
}
}
printf("\n The largest value is %i and the number of occurrence is %i \n ", largest, occurrence);
return 0;
這是我使用逗號作為分隔符的輸出示例:
How many integers do you want to enter? 4
Input 4 list of integers:
5, 6, 6, 6
The largest value is 5 and the number of occurrence is 4
而正確的輸出應該是:
How many integers do you want to enter? 4
Input 4 list of integers:
5, 6, 6, 6
The largest value is 6 and the number of occurrence is 3
有人可以指出我到底在哪里做錯了嗎?
uj5u.com熱心網友回復:
基本問題是,在讀取 C 中的輸入時,您需要考慮輸入中的每個字符(可能)——每個空格、每個換行符、每個逗號或其他標點字符,以及您真正關心的所有值和想讀。
當使用scanf讀取輸入,空白是特殊的,因為它是容易被忽視。每次%在scanf的字串指令,除了為%c,%[并%%會自動忽略前導空格。與"%i"您使用的一樣,4輸入之后的換行符會被回圈中的第一次 scanf 呼叫自動忽略(跳過),并且后面的呼叫將跳過數字之間的空格。但是,任何逗號(或其他標點符號)都不會。您需要明確跳過(閱讀)它們。實際上,當您的程式scanf在回圈的第二次迭代中呼叫時,要讀取的下一個字符是,(不是數字也不是空格),因此轉換失敗并且沒有任何內容存盤到listOfIntegers并回傳 0(沒有匹配的指令)。由于您忽略了 scanf 的回傳值,因此您不會注意到這一點,并愉快地繼續使用第一次迭代留下的相同值。
您可以嘗試的一件事是scanf("%i,", &listOfIntegers)在您的回圈中。,如果它立即出現在您的號碼之后,它將讀取一個單曲。如果數字后面的字符不是 a,它什么也不做。雖然這適用于您的示例,但它不適用于像這樣的輸入
5 , 6, 6 , 6
由于逗號前有多余的空格。一個更能接受的可能性是
scanf("%i%*[ \t,;.]", &listOfIntegers)
這將跳過(并忽略)數字后面的所有空格、制表符、逗號、分號和句點。
無論如何,檢查 scanf 的回傳值也是一個好主意:
if (scanf("%i%*[ \t,;.]", &listOfIntegers) < 1) {
... something is wrong -- the next input is not a number
捕捉某人輸入字母或其他非數字輸入。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/357390.html
