2013-03-30 129 views
0

我正在讀取來自stdin的輸入,例如,汽車的名稱,汽車的類型。C將輸入讀入循環中的字符數組中

我面臨的問題是,如果我輸入車輛數量2,並且我輸入 循環,則第二個值將通過scanf覆蓋爲第一個值。

輸入汽車的數量:2

輸入列的名稱:雪佛蘭

可用的汽車類型可以是電,氣 - 輸入汽車的類型:氣體

輸入列的名稱:chevy2

可用的汽車類型可以是電,氣 - 輸入汽車的類型:電動

現在如果我打印所有我看到的是電

#include <stdio.h> 

    int main(int argc, char *argv[]) 
    { 
     setbuf(stdout, NULL); 
     int carNum; 
     int i; 

     char carName[50]; 
     char carType[200]; 

     printf("\nEnter number of cars:"); 
     scanf("%d",&carNum); 
     for(i=0;i<carNum;i++) 
     { 
      printf("\nEnter name of car :"); 
    scanf("%s", &carName[i]); 

    printf("\nType of car available can be electric,gas - Enter type of car %d: ");        
    scanf("%s", &carType[i]); 
     } 

     for(i=0;i<carNum;i++) 
     { 

      printf("\nName of car %d: ",i+1); 
      printf("\n%s", &carName[i]); 


      printf("\nType of car %d: ",i+1); 
      printf("\n%c", &carType[i]); 
     } 


     return 0; 
    } 

回答

2

編輯新的答案:

正如你表明你想讀一些數車名和類型的你需要的字符串數組carNamecartype,而不是簡單的字符數組你的要求。像(對於文章的解決方案):

#define LEN 100  // declare sufficient length size 

char carName[50][LEN]; // in main() 
char carType[50][LEN]; 

和您的正確的scanf和printf語句應該是這樣的:

scanf("%d",&carNum); 
for(i=0;i<carNum;i++){ 
    printf("\nEnter name of car :"); 
    scanf("%s", carName[i]); 
    printf("\nType of car available can be electric,gas - Enter type ofcar: "); 
    scanf("%s", carType[i]); 
} 
for(i=0;i<carNum;i++){ 
    printf("\nName of car %d: ",i+1); 
    printf("\n%s", carName[i]); 
    printf("\nType of car %d: ",i+1); 
    printf("\n%s", carType[i]); 
}  

通知:當我用戶%s我給char*在scanf函數參數作爲以及在printf的
老答案: 在第一個for循環,你scanf函數聲明是錯誤的:

 scanf("%s", &carName[i]); 
         ^remove [i] 
    scanf("%s", &carType[i]); 
         ^remove [i] 

你只需要編寫,如:

// printf 
    scanf("%s", &carName); 
    //print      
    scanf("%s", &carType); 
在第二循環

在printf語句是錯誤的。

printf("\n%c", &carType[i]); 
      ^not need 

正確的是

printf("\n%c", carType[i]); 

而且我覺得你的要求是:

printf("\n%s", carType); 
+0

不會更新的問題。 –

+0

無法正常工作,您正嘗試像這樣寫入char **。 – stdcall

+0

好的,對不起,我改成原來的。 – jamesT

2

你聲明並不表示字符串這些陣列,它代表的50組成的連續內存字節和200字節。這足以存儲單個50個字符的字符串和200個字符串。 你需要的是一個字符串數組,聲明像這樣。

char * carnames[MAX_INPUT]; 

我sugesst創建緩衝區讀取每個字符串,然後用strdup()會拷貝並分配字符串這是發生在carnames。

下面是一個例子:

char buffer[80]; 
char * carnames[MAX_INPUT]; 

for(i=0;i<carNum;i++) 
{ 
    scanf("%s", buffer); 
    carnames[i] = strdup(buffer); 
} 

注意的strdup的字符串分配內存,所以一旦你做到了,應該釋放內存。

+0

感謝您的回答。這是另一種可能性。 – jamesT

+0

感謝您的幫助和解答。我無法讓它工作。 Char中的C應該小寫。我會再試一次。 – jamesT

+0

我修好了,這是Ipad的自動大寫 – stdcall