数组“指针”写入值?

时间:2013-05-20 20:12:31

标签: c

我试图从用户获取5个字符串,并将该字符串存储到char字符串数组中,但是,当我尝试使用该程序时,程序的输出总是相同的,最后一个值是用户已经输入了......

请参阅我的代码:

#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]);
}

那么,我如何解决这个问题,如何将用户挖掘的值放入数组中,并在其他时间打印值?

4 个答案:

答案 0 :(得分: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]);
}

答案 1 :(得分: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;
}

答案 2 :(得分: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]);
    }

答案 3 :(得分:0)

注意char *s[50]只声明50个指针(不是指向50个字符的指针!);他们需要指出某个地方才能复制一些内容。那个2-dim char的数组怎么样:

char s[5][50];

然后用

读入它们
fgets (s[i], 50, stdin);

优点:无需捣乱strost,malloc和free。