2013-05-20 40 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混乱。