0

我尝试从用户那里获取 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

4 回答 4

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]);
}
于 2013-05-20T20:17:49.717 回答
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;
}
于 2013-05-20T20:19:06.227 回答
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]);
    }
于 2013-05-20T20:18:27.060 回答
0

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

char s[5][50];

然后用

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

优点:不用纠结strdup、malloc和free。

于 2013-05-20T20:19:21.980 回答