2015-09-04 59 views
1
#include <stdio.h> 

int main() 
{ 
    int m,i,sum,num; 

    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); 
     //continue; 
    } 
    printf("Sum= %d ",sum); 
} 

在上面的代碼中,它應該顯示n個數字的總和。但在我的代碼中,它正在取一個m的額外值(m是計算總和所需的值的數量)。n個數字之和

例如,如果我,採取併購的3它需要4個輸入和顯示的3

+12

'scanf函數(「%d」,&num);' - >'scanf(「%d」,&num);' – BLUEPIXY

+3

是的,擺脫你的兩個scanf的空間 – billpcs

+1

@BLUEPIXY我認爲你應該發佈這個答案 –

回答

2

正如其他(@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變量,並開始嘗試匹配的空間。它得到NLEOL。控制仍然是這個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 
+0

您的回答非常有用。我想問你關於C的深入學習。我剛剛開始學習C,我想深入學習的心情,我該怎麼做?我正在接受視頻教程的幫助。 –

+0

@AryanRagavan我不確定你的意思是「深度學習」...... –

+0

從零開始學習每一件事。嘗試瞭解關於C的所有知識。 –

1

的總和。這是因爲你在scanf線的%d後有一個空格。

變化

scanf("%d ",&num); 

scanf("%d",&num); 

Scanf通常會忽略空格,所以你不想在你的格式字符串空間。

0

它的原因extra space in scanf()。更改scanf("%d ",&num) to scanf("%d",&num)

Scanf(), fscanf(),您可以按照此。

的scanf()系列的功能從控制檯或從 文件流中讀取數據,解析它,在你 參數列表提供變量的結果存儲路程。

格式字符串與printf()中的格式字符串非常相似,因爲您可以通過 指示它讀取「%d」,例如int。但它也有 附加功能,最值得注意的是它可以在格式字符串中指定的輸入中吃掉其他 字符。

你應該寫:

int main() 
{ 
    int m,i,sum,num; 

    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); 
     //continue; 
    } 
    printf("Sum= %d ",sum); 
} 
0

一個重構的代碼看起來像這樣

#include <stdio.h> 

int main() { 
    int m, num, sum = 0; 
    scanf("%d", &m); // Let scanf automatically skip whitespace 
    while (m--) { 
     scanf("%d", &num); 
     sum += num; 
    } 
    printf("Sum= %d\n", sum); 
    return 0; 
} 
相關問題