c - 从指针数组 C 中删除重复元素

标签 c arrays pointers

我正在尝试获取用户输入并在单独的行上打印出每个单词(不重复)。到目前为止我所做的是能够接受用户输入并按字母顺序分别打印每一行。我现在需要做的是能够删除 char* argue[] 数组中的重复项

我的输入:

./a.out banana apple apple apple zoo cat fork

我的输出:

apple
apple
apple
banana
cat
fork
zoo

需要做的是打印一个苹果而不是三个。

这是我到目前为止所做的,我已经评论了问题所在的代码部分

#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[]) {
  int i, j, k, size;
  size = argc -1;
  char *key;
  char* a[argc-1];

  for (i = 2; i < argc; i++) {
    key = argv[i];

    j = i-1;
    while (j >= 1 && strcmp(argv[j], key) > 0) {
      argv[j+1] = argv[j];
      j--;
    }

    argv[j+1] = key;
  }

  //Problem                                                                                                                                                   
  //for(i = 2; i < size; i++){                                                                                                                                
  //    if(argv[i-1] != argv[i])                                                                                                                              
  //      a[i] = argv[i-1];                                                                                                                                   
  //}                                                                                                                                                         

  //for(i=0; i< size; i++)                                                                                                                                    
  //  puts(a[i]);                                                                                                                                             

  for(i=1; i< argc; i++)
    puts(argv[i]);

  return 0;
}

最佳答案

首先,您可以使用标准 C 函数 qsort在 header 中声明 <stdlib.h> .

如果你想输出不重复的参数,那么就不需要去掉参数。您可以只输出唯一的参数。

程序可以如下所示

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int cmp(const void *left, const void *right)
{
    return strcmp(*(const char **)left, *(const char **)right);
}

int main( int argc, char * argv[] )
{
    if (argc > 1)
    {
        qsort(argv + 1, argc - 1, sizeof(*argv), cmp);

        for (int i = 1; i < argc; )
        {
            puts(argv[i]);
            while (argv[++i] != NULL && 
                   strcmp(argv[i - 1], argv[i] ) == 0);
        }
    }

    return 0;
}

如果提供这些命令行参数

banana apple apple apple zoo cat fork

那么程序输出会是这样

apple
banana
cat
fork
zoo

如果您确实要“删除”重复的参数,那么 argc应具有相对于修改后的参数列表和 argv[argc] 的正确值应等于 NULL .

程序可以如下所示

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int cmp(const void *left, const void *right)
{
    return strcmp(*(const char **)left, *(const char **)right);
}

int main( int argc, char * argv[] )
{
    if (argc > 1)
    {
        qsort(argv + 1, argc - 1, sizeof(*argv), cmp);

        int n = 1;

        for (int i = 1; i < argc; i++)
        {
            int j = 1;
            while (j < n && strcmp(argv[j], argv[i]) != 0) j++;

            if (j == n)
            {
                if (n != i) argv[n] = argv[i];
                ++n;
            }
        }

        argc = n;
        argv[argc] = NULL;
    }

    for ( int i = 1; i < argc; i++ ) puts(argv[i]);

    return 0;
}

它的输出将与上面显示的相同。

关于c - 从指针数组 C 中删除重复元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40728355/

相关文章:

c - += 运算符链接(带一点 UB)

c++ - 在函数中将数组作为参数传递

python - fscanf 在 ctype python 调用中不起作用

c - C 无效二进制文件中的错误消息

python - numpy 数组元素的累积积分

c - 为什么在这种情况下需要取消引用 char?

c - printf 如何在 ANSI-C 中编译(可变参数)

javascript - 嵌套循环未形成完整对象 - 问题

c++ - 'std::string {aka std::basic_string<char>}' 分配中的类型不兼容

c++ - `const char*' 到 `char'