2013-05-20 56 views
0

我試圖從用戶獲得5個字符串,並將該字符串存儲到char字符串數組中,但是,當我嘗試使用該程序時,程序的輸出總是相同,用戶的最後一個值已經inputed ...寫入數值時數組「指針」?

見我的代碼:

#include <stdio.h> 

int main() 
{ 
    int i = 0; 
    char *s[50]; 
    char str[50]; 

    for(i=0;i<5;i++) 
    { 
     fgets(str, 50, stdin); 
     s[i] = str; 
    } 

    for(i=0;i<5;i++) 
     printf("%s\n ", s[i]); 
} 

所以,我怎麼能解決這個問題,我怎樣才能把用戶digited到陣列的價值,而在其他時間打印價值觀?

+0

使用strcpy(s [i],str)而不是s [i] = str –

+0

對參數's'和'str'使用strcpy不正確;你不想將一組字符複製到指針數組中。 – ryanbwork

+0

@ChristopherBales:你不能使用'strcpy()',除非有空間複製到...並且你沒有確定提供了這樣的空間。 –

回答

4

您需要使用strcpy而不是簡單的賦值。

str是一個內存位置,所有s [i] = str正在做的是指向每次調用fgets時被覆蓋的同一個緩衝區。

像下面這樣會得到你所需要的:

#include <stdio.h> 

int main() 
{ 
    int i = 0; 
    char s[5][50]; 
    char str[50]; 

    for(i=0;i<5;i++) 
    { 
     fgets(str, 50, stdin); 
     strcpy(s[i],str); 
    } 

    for(i=0;i<5;i++) 
     printf("%s\n ", s[i]); 
} 
+2

此時'str'和'strcpy'對你沒有好處;你可能只是'fgets(s [i],50,stdin)''。 – amalloy

1

所有s點的指針str。所以只有最後一個輸入被存儲。

務必:

for(i=0;i<5;i++) 
{ 
    fgets(str, 50, stdin); 
    s[i] = strdup(str); 
} 

如果的strdup()不可用(POSIX功能),那麼你就可以實現它,或者使用malloc() + strcpy()

for(i=0;i<5;i++) 
{ 
    fgets(str, 50, stdin); 
    s[i] = malloc(strlen(str) + 1); 
    strcpy(s[i], str); 
} 

最後的free()在s指針:

for(i=0;i<5;i++) 
    { 
    free(s[i]); 
    } 
+0

嗨,對不起延遲:X ...所以,有辦法做到這一點,而不是使用strdup ou strcopy或malloc? – Alexandre

+0

不需要。如果要動態分配字符串,沒有其他方法。但是,您可以簡單地聲明一個靜態數組。看到這裏:http://ideone.com/8nRrvp –

3

你正在創建一個字符數組,下面一行

char str[50]; 

然後在每個指針你數組s指向同一個內存位置。每次調用fgets時,都會覆蓋存儲在內存中的字符串,因此,當您打印出s陣列中的每個字符串時,您都會得到相同的結果:用戶輸入的最後一個值,其中存儲在單個本地分配的內存塊中。

嘗試分配一個新的內存塊每次從用戶閱讀的字符串,然後存儲新內存塊的指針在s

char *str; 
for(i=0;i<5;i++) 
{ 
    str = malloc(50); 
    fgets(str,50,stdin); 
    s[i] = str; 
} 
+0

方式去ryanbwork! – 75inchpianist

0

注意char *s[50]只宣佈50個球(不指針50個字符!);他們需要指向某個地方,然後才能向他們複製某些內容。什麼字符的2維數組:

char s[5][50]; 

,然後讀入他們

fgets (s[i], 50, stdin); 

優勢:無需用的strdup,malloc和free混亂。