Arrays 如何在c中从字符串数组中删除重复字符串

Arrays 如何在c中从字符串数组中删除重复字符串,arrays,c,string,pointers,Arrays,C,String,Pointers,我正在尝试制作一个程序,在这个程序中,我有一个链表,上面有不同的城市名称+一些其他不相关的东西。例如,城市名称是“西雅图、波士顿、纽约、西雅图、华盛顿、波士顿”。我想做的是制作一个数组,它只包含城市的唯一名称。举个例子,它是这样的:“西雅图,波士顿,纽约,华盛顿” 我的想法是制作一个字符串的原始数组,它只是包含所有重复项的原始数据,然后遍历每个城市,并使它们的所有其他外观都为“NULL”。由于某种原因,它不能正常工作,我不知道为什么 另外,如果你们能帮我提供你们自己的、更简单的解决方案,我将不胜

我正在尝试制作一个程序,在这个程序中,我有一个链表,上面有不同的城市名称+一些其他不相关的东西。例如,城市名称是“西雅图、波士顿、纽约、西雅图、华盛顿、波士顿”。我想做的是制作一个数组,它只包含城市的唯一名称。举个例子,它是这样的:“西雅图,波士顿,纽约,华盛顿”

我的想法是制作一个字符串的原始数组,它只是包含所有重复项的原始数据,然后遍历每个城市,并使它们的所有其他外观都为“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

  • 函数返回新的#/strings。这个数字很好,首先,你不需要复制两次这些字符串来做你想做的事情……是吗?其次,我希望你确定名称短于256个字符,否则你的代码中有几种缓冲区溢出的可能性。更安全的方法是复制的方法是
    strncpy()
    @MarcoBonelli我确实知道这些名称短于256个字符,但在给我的作业中,他们明确表示使用了我所做的最多256个字符的字符串。问题在于第二个
    strcmp
    ,它将
    raw[j]
    new[I]进行比较
    new[i]
    在代码中没有任何内容。一旦你解决了这个问题,下一个问题就是
    strcpy
    raw[i]
    复制到
    new[i]
    中。这应该是将
    raw[i]
    复制到
    new[k]
    strcpy
    如果城市不都在相同大小的缓冲区中,则不会执行您想要的操作。但您甚至不需要strcpy;您可以直接分配(并确保在必要时释放被覆盖的元素)好的点-示例已修改。但未编译或测试;)