2016-09-01 115 views
0

這是一個簡單的程序,用戶輸入一系列數字,然後添加。結果打印在屏幕上。這裏的代碼:Scanf在C中重複自己

int main() { 
int * numbers; 
int result = 0; 
int howMany; 
int i; 

printf("How many numbers would you like to add?\n"); 
scanf(" %d\n", &howMany); 

numbers = (int *) malloc(howMany * sizeof(int)); 

for(i = 0; i < howMany; i++){ 
    printf("Please enter number %d.\n", i + 1); 
    scanf(" %d\n", &numbers[i]); 
    result = result + numbers [i]; 
} 
printf("Result: %d", result); 
return 0; 
} 

但是有一個問題。該程序詢問用戶因某種原因需要添加兩次數字。這是爲什麼?我該如何解決它? 此外,不知道這是否相關,但結果也沒有意義。有時候他們是正確的,有時候他們不是,不知道爲什麼。 謝謝。

+2

'scanf'中'%d'後的'%d'和'\ n'之前的空間用途是什麼? – haccks

+6

從'scanf'語句中刪除'\ n',它會正常工作(可以檢查'scanf'的返回值,但這是另一個問題)。 –

+2

第1步:每當代碼遇到scanf()問題時:檢查它的返回值。這不會解決這個問題,但它應該是第一件嘗試。 – chux

回答

2

的程序要求用戶想多少個號碼兩次因某種原因增加。這是爲什麼?我該如何解決它?

你的程序只提示一次多少個數字。但是,它會延遲詢問每個特定的號碼,直到輸入該號碼爲止,然後在輸出結果之前在最後(遲到)提示後需要一個額外的非空行。

此外,不知道這是否相關,但結果也沒有意義。有時候他們是正確的,有時候他們不是,不知道爲什麼。

它是相關的:事實是,每號碼提示是遲到的事實讓你困惑你添加哪些號碼。

這一切都歸結爲您的scanf()格式,因爲@Mark已經說過了(儘管有些簡單)。包含換行符在內的任何非空空白運行符合scanf()格式都與可能爲空的空白運行匹配。當它匹配這樣的運行時,scanf()必須繼續掃描,直到看到非空白字符。然而,交互式輸入是行緩衝的,因此在您發送全新行之前不會有新的輸入可用。然後,下一行中的第一個非空白字符已準備就緒,正在等待後面的scanf()

scanf()可能是相當棘手的使用正確,特別是對於交互式輸入。它最適合固定格式輸入。你可以做到這一點scanf() - @Mark告訴你如何 - 但通常這裏的建議是使用fgets()一次讀取輸入一行,而sscanf()(或您選擇其他機制)來解析每一行。即使這可能是一個防彈的挑戰,但你從更堅實的基礎開始。

0

你的問題是因爲你在printf和scanf函數中錯誤地放置了換行符。

這裏是你可能尋找的代碼:

int main() { 
    int * numbers; 
    int result = 0; 
    int howMany; 
    int i; 

    printf("How many numbers would you like to add?: "); 
    scanf("%d", &howMany); 

    numbers = (int *) malloc(howMany * sizeof(int)); 

    for(i = 0; i < howMany; i++){ 
    printf("Please enter number %d: ", i + 1); 
    scanf("%d", &numbers[i]); 
    result = result + numbers [i]; 
    } 
    printf("Result: %d\n", result); 
    return 0; 
} 
+1

根本不使用scanf()使它更加強健;-) – usr

+0

@usr - true - 「scanf()」生活在編碼泥濘的黑暗朦朧沼澤中。 – chux