我试图制作一段代码,提示用户输入一些字符串,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]);
}
关于我在这里缺少什么的想法?
答案 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);