2014-07-09 86 views
0

我試圖提示用戶輸入多個數字,當用戶輸入字符串時,程序會計算這些數字的總和。我有困難,因爲我要保持程序儘可能地簡單,而無需創建其他變量來存儲字符串等輸入不同的類型(在C中)

int menu(int choice){ 
    int total = 0, values = 0; 
    char *string = (char*) &values; 
    switch(choice){ 
    case 1: printf("Enter your values separated by a whitespace: "); 
     while(string != "compute") { 
     scanf("%d",&values); 
     total = total + values; 
     } 
    } 
    return total; 
} 

我希望用戶爲S進入儘可能多的數字,他/她想要(內明顯內存限制),所以我必須不斷預測int(或其他「數字」),那麼預測字符串的最有效方法是什麼?

我知道下面這一行有點粗略,但爲什麼我要讓變量「字符串」像字符串/字符類型那樣對待「值」呢? char *string = (char*) &values;

+2

這不是您比較字符串的方式。 'man strcmp' –

+0

'string'指向一個'int'類型,無論用戶輸入到什麼'scanf',它都不會保存實際的字符串。另外,這不是你如何在C中測試字符串。通過執行'string!=「compute」'你實際上是在比較指針。 – Havenard

+0

爲了簡單起見,我建議你使用輸入0作爲提示來終止循環。 – Havenard

回答

0

當你寫這樣

int total = 0, values = 0; 
char *string = (char*) &values; 

您可以設置指針字符串指向整數值values所以如果用戶輸入的值大於sizeof(values)即的sizeof(INT),該程序會崩潰。

而是使用一個專用緩衝器用於輸入字符串

char string[128] = {0};

scanf的可以用於輸入,但它是安全用fgets(),以儘量減少緩衝區溢出的風險:

fgets(string, sizeof(string), stdin);

如果您需要保存輸入的各個值,請聲明一個int數組

int values[100];

當用戶輸入了一些檢查「串」的內容,看看它是否 包含計算 - 這可能是足夠的檢查的第一個字符 - 例如if (string[0] == 'c')其他的字符串轉換爲int,並把它的值數組中:

values[i++] = atoi(string);

編輯:

由於麥克納布指出,與fgets()增加了一個\ n字符串,所以如果你想比較你必須考慮的整個字符串,例如

if (!strncmp("compute", string, strlen("compute")) 
{...} 
+0

如果'strcmp(string,「compute」)''的一個天真的應用程序在這裏會失敗,那麼用'fgets'也會提到'\ n'問題。 –

+0

是的,雖然在這種情況下他可能只檢查字符串的第一個字符,atoi會忽略\ n,但如果會有更多以相同字母開頭的關鍵字,則爲true。 –

+0

什麼是這種情況下的「緩衝區溢出」?您已經使用char string [128] = {0}聲明瞭專用緩衝區。你的意思是如果輸入超過128字節? – fibono

0

最有效的方法將是一個字符串讀取(使用fgets()),然後嘗試確定它是什麼。如果是整數,則可以使用atoistrtol進行轉換。如果它是浮動的,你可以使用strtod。否則,你可以根據需要解析字符串。

那麼你會像這樣結束:

char str[15]; 
long sum = 0, val; 
char* ptr; 
while (1) 
{ 
    fgets(str, 15, stdin); 
    if (0 == strcmp(str, "compute")) 
    { 
     printf("sum: %d\n", sum); 
     break; 
    } 
    val = strtol(str, &ptr, 10); 
    // error-check here. 
    sum += val; 
} 

另外,更簡單的選擇,可能是讀整數(使用scanf,在上面的代碼)文件結束之前的-,然後打印總和。該方法有一些侷限性:您需要通過某個具有已定義的EOF的通道輸入輸入,並且在整數列表結束後無法接收更多輸入。正如Havenard所建議的那樣,使用一個特定的值(例如0)作爲標記,它沒有這些缺點,但不允許標記值出現在數字列表中。

0

要閱讀一個字符串,你必須爲它分配一些空間。你不能將它讀入一個整數。

要支持讀取可能是整數或字符串的輸入,您必須讀取一個字符串;然後您可以嘗試將該字符串轉換爲整數。

例如:

char buffer[50]; 
scanf("%49s", buffer); 

if (0 == strcmp(buffer, "compute")) 
    return 0; // they typed "compute" 

if (0 == sscanf(buffer, "%d", &number)) 
    break;  // they typed something that was not a number 

total += number; 
0

不知道爲什麼你想在這一點上比較字符串。如果您只想讀取空格分隔的整數直到輸入非整數值,請讓scanf爲您完成工作:

int menu(int choice){ 
    int total = 0; 
    int value; 
    switch(choice){ 
    case 1: printf("Enter your values separated by a whitespace: "); 
     while(scanf("%d",&value) > 0) { 
     total += value; 
     } 
    } 
    /* Here, use scanf to get the first non-integer value entered */ 
    return total; 
}