正如其他(@BLUEPIXY和@BillDoomProg)已經在評論中指出,你的問題您的scanf
格式字符串中的空格。同時檢查this answer。
同時改變你的scanf
格式字符串來自:
scanf("%d ",&m);
...
scanf("%d ",&num);
要:
scanf("%d", &m);
...
scanf("%d", &num);
只需刪除空間,它會正常工作。
scanf()的
從手動
格式字符串由指令的序列(的...)
甲指令是下列之一:
的空白字符的序列(空格,製表,換行,等;見 isspace爲(3))。該指令與輸入中的任意數量的空白匹配,包括 無。
還要注意的是stdin
被緩衝,所以結果是從你所期望的有一點不同:
man stdin
注
流標準錯誤無緩衝。流標準輸出當它指向終端時被行緩衝。在fflush(3)或 exit(3)被調用或打印換行符之前,部分行不會出現。這可能會產生意外的 結果,尤其是在調試輸出時。可以使用setbuf(3) 或setvbuf(3)調用來更改 標準流(或任何其他流)的緩衝模式。請注意,如果stdin與終端相關聯,則 也可能在終端驅動程序中存在輸入緩衝區,完全與輸入緩衝區無關的 。 (實際上,通常終端輸入是在內核中緩衝的行 )。可以使用 調用(如tcsetattr(3);)來修改此內核輸入處理。另請參閱stty(1)和termios(3)。
因此,讓我們一步步地檢查你的程序。
你的程序開始運行,並輸入該編號2.這是輸入緩衝的樣子:
2\n
scanf("%d ", &m)
指派2至m
變量,並開始嘗試匹配的空間。它得到NL
和EOL
。控制仍然是這個scanf
因爲它只是匹配一個換行符(被認爲是空白),並正在等待匹配更多,而是它得到了End-Of-Line
,所以還是等待,當你鍵入:
1\n
然後再次讀取stdin,並意識到輸入流中的下一個字符不是空格並返回(它的格式字符串條件已完成)。在這一點上,你進入循環和你的下一個scanf("%d ",&num)
被調用,它想要讀取它的整數,:它讀取1並將其存儲在num
變量。然後再次開始匹配空格並獲取新行,並重覆上述模式。然後,當你輸入:
2\n
這第二scanf
變得比空白 和收益不同的角色,讓你的循環範圍保持執行打印當前sum
。 循環中斷條件未滿足,所以它再次啓動。它調用 scanf
,它有效地讀一個整數到變量,那麼 模式重演......
3\n
它正在等待一個空白,但它有一個字符,而不是。所以你的 scanf
返回現在環路中斷條件符合。這是你退出你的循環,打印整個sum
,並得到weired砍伐,它 「添加」3個數字,但總和只增加了前2(如你打算 首先)。
您可以檢查3掛在標準輸入用一個簡單的除了你的代碼:
#include <stdio.h>
int main()
{
int m, i, sum, num;
char c;
i = 0;
sum = 0;
scanf("%d ", &m);
while (i < m) {
scanf("%d ", &num);
sum = sum + num;
i = i + 1;
printf("Value of sum= %d\n", sum);
}
while((c = getchar()) != '\n')
printf("Still in buffer: %c", c);
return 0;
}
將輸出(與上面的投入,職高):
$ ./sum1
2
1
2
Value of sum= 1
3
Value of sum= 3
Still in buffer: 3
'scanf函數(「%d」,&num);' - >'scanf(「%d」,&num);' – BLUEPIXY
是的,擺脫你的兩個scanf的空間 – billpcs
@BLUEPIXY我認爲你應該發佈這個答案 –