【发布时间】:2020-07-13 21:40:07
【问题描述】:
我正在尝试制作程序,其中我有一个链接列表,其中包含不同的城市名称+一些其他不相关的东西。城市名称是,例如。 “西雅图、波士顿、纽约、西雅图、华盛顿、波士顿”。我想做的是制作一个只有城市名称的数组。因此,举个例子,它会是这样的:“西雅图、波士顿、纽约、华盛顿”。
我的想法是制作一个原始字符串数组,这将只是包含所有重复项的原始数据,然后遍历每个城市并将它们的所有其他外观设为“NULL”。由于某种原因,它无法正常工作,我不知道为什么。
另外,如果你们能用自己的、更简单的解决方案版本帮助我,我将不胜感激。
这是我的代码:
void city_list(City *head)
{
City *temp = head;
char** names_raw;
char** names_new;
int num_names = 100;
int curr_pos = 0;
names_raw = malloc(num_names * sizeof(char*));
for(int i = 0; i < num_names; i++)
{
names_raw[i] = malloc(256 * sizeof(char));
}
while(temp != NULL)
{
strcpy(names_raw[curr_pos++], temp->name);
temp = temp->next;
}
names_new = malloc(num_names * sizeof(char*));
for(int i = 0; i < num_names; i++)
{
names_new[i] = malloc(256 * sizeof(char));
}
for(int i = 0; i < curr_pos; i++)
{
if(strcmp(names_raw[i], "NULL"))
{
for(int j = i+1; j < curr_pos; j++)
{
if(!strcmp(names_raw[j], names_new[i]))
{
strcpy(names_raw[j], "NULL");
}
}
strcpy(names_new[i], names_raw[i]);
}
}
for(int i = 0; i < curr_pos; i++)
{
printf("%s\n", names_new[i]);
}
free(names_raw);
free(names_new);
}
当我调试代码时,我没有收到任何错误,但它会打印出所有城市,就像没有对数组做任何事情一样。
【问题讨论】:
-
嗯,首先,你真的不需要复制这些字符串两次来做你想做的事......你呢?其次,我希望您确定名称短于 256 个字符,否则您的代码中存在多种缓冲区溢出的可能性。更安全的复制方式是
strncpy()。 -
@MarcoBonelli 我确实知道这些名称少于 256 个字符,但在给我的作业中,他们明确表示要使用我所做的最多 256 个字符的字符串。
-
问题出在第二个
strcmp,它将raw[j]与new[i]进行比较。那时代码中的new[i]中没有任何内容。一旦你解决了这个问题,下一个问题就是将raw[i]复制到new[i]的strcpy。那应该是将raw[i]复制到new[k]。