Arrays 如何在c中从字符串数组中删除重复字符串
我正在尝试制作一个程序,在这个程序中,我有一个链表,上面有不同的城市名称+一些其他不相关的东西。例如,城市名称是“西雅图、波士顿、纽约、西雅图、华盛顿、波士顿”。我想做的是制作一个数组,它只包含城市的唯一名称。举个例子,它是这样的:“西雅图,波士顿,纽约,华盛顿” 我的想法是制作一个字符串的原始数组,它只是包含所有重复项的原始数据,然后遍历每个城市,并使它们的所有其他外观都为“NULL”。由于某种原因,它不能正常工作,我不知道为什么 另外,如果你们能帮我提供你们自己的、更简单的解决方案,我将不胜感激 这是我的密码:Arrays 如何在c中从字符串数组中删除重复字符串,arrays,c,string,pointers,Arrays,C,String,Pointers,我正在尝试制作一个程序,在这个程序中,我有一个链表,上面有不同的城市名称+一些其他不相关的东西。例如,城市名称是“西雅图、波士顿、纽约、西雅图、华盛顿、波士顿”。我想做的是制作一个数组,它只包含城市的唯一名称。举个例子,它是这样的:“西雅图,波士顿,纽约,华盛顿” 我的想法是制作一个字符串的原始数组,它只是包含所有重复项的原始数据,然后遍历每个城市,并使它们的所有其他外观都为“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);
}
void city\u列表(城市*head)
{
城市*温度=人头;
字符**原始名称;
字符**新名称;
int num_names=100;
int curr_pos=0;
names_raw=malloc(num_names*sizeof(char*);
对于(int i=0;i名称);
温度=温度->下一步;
}
names_new=malloc(num_names*sizeof(char*);
对于(int i=0;i
当我调试代码时,没有发现任何错误,但它会打印出所有的城市,就像没有对数组进行任何处理一样。您没有向我们展示完整的示例(“城市”是什么?您的输入数组是如何构建的?等等)。但我怀疑你把事情弄得太复杂了:( 建议:
int delete\u dupes(char*arr[],int n)
(或类似)的函数中
int delete_dupes(char* arr[], int n) {
char *current_name = arr[0];
int i=1, j=1;
while (i < n) {
if (strcmp(arr[i], current_name) != 0) {
free(arr[j]); /* Do *NOT* do this if you didn't malloc() this string!!!! */
arr[j++] = arr[i];
current_name = array[i];
}
}
return j;
}
int delete_dups(char*arr[],int n){
char*current_name=arr[0];
int i=1,j=1;
而(i
strncpy()
@MarcoBonelli我确实知道这些名称短于256个字符,但在给我的作业中,他们明确表示使用了我所做的最多256个字符的字符串。问题在于第二个strcmp
,它将raw[j]
与new[I]进行比较
。new[i]
在代码中没有任何内容。一旦你解决了这个问题,下一个问题就是strcpy
将raw[i]
复制到new[i]
中。这应该是将raw[i]
复制到new[k]
strcpy
如果城市不都在相同大小的缓冲区中,则不会执行您想要的操作。但您甚至不需要strcpy;您可以直接分配(并确保在必要时释放被覆盖的元素)好的点-示例已修改。但未编译或测试;)