数组只填充最后一个用户输入的输入字符串

时间:2014-03-09 09:13:20

标签: c arrays string user-input

我试图制作一段代码,提示用户输入一些字符串,n,动态分配n个字符串的数组,然后提示用户输入n个字符串。

我遇到的问题是数组只显示自己被用户输入的最后一个字符串填充。

实施例: 程序提示用户输入n 用户输入3。 用户为数组中的第一个元素输入“test1” 用户为数组中的第二个元素输入“test2” 用户为数组中的第三个元素输入“test3”

我去打印数组的内容,它说每个元素都是“test3”

这是代码: (flush_buffer()和strip_newline()是我写的函数,对我遇到的问题并不重要)

printf("How many strings?\n");
scanf("%d", &max_strings);
flush_buffer();

string_array = (char**) malloc(max_strings * sizeof(char*));

for(i = 0; i < max_strings; i++)
{
    scanf("%s", temp);

    strip_newline(temp);

    string_array[i] = temp;

    printf("string_array[%d] is: %s\n", i, string_array[i]);
}
    for(i = 0; i < max_strings; i++)
{
    printf("i: %d\n", i);
    printf("string_array[%d] is: %s\n", i, string_array[i]);
}

关于我在这里缺少什么的想法?

3 个答案:

答案 0 :(得分:2)

通过作业

string_array[i] = temp;

您将string_array 中的所有指针指向同一位置


我建议您使用strdup来复制字符串:

string_array[i] = strdup(temp);

当然,这意味着您必须free集合中的所有字符串。

答案 1 :(得分:0)

分配字符串时:

string_array[i] = temp;

您只需在每个字符串中存储临时缓冲区的指针,在读取下一个字符串后将覆盖该指针。换句话说,所有字符串都具有相同的值,即temp,其中包含最后一个字符串的内容。

如果要存储字符串,则必须为string_array[i]分配内存,然后使用strcpy复制内容。或者,您可以使用快捷方式:

string_array[i] = strdup(temp);

请注意,strdup在内部分配您必须free()的内存。

答案 2 :(得分:0)

您可以使用此代码:

int max_strings;
printf("How many strings?\n");
scanf("%d", &max_strings);

//allocate memory
char **string_array = (char**) malloc(max_strings * sizeof(char*));
for (int i = 0; i < max_strings; i++)
{
    string_array[i] = (char*)malloc(sizeof(char) * 50);
}

for(int i = 0; i < max_strings; i++)
{
    scanf("%s", string_array[i]);

    printf("string_array[%d] is: %s\n", i, string_array[i]);
}
for(int i = 0; i < max_strings; i++)
{
    printf("i: %d\n", i);
    printf("string_array[%d] is: %s\n", i, string_array[i]);
}

//free memory
for (int i = 0; i < max_strings; i++)
{
    free(string_array[i]);
}
free(string_array);