我正在尝试获取用户输入并在单独的行上打印出每个单词(不重复)。到目前为止我所做的是能够接受用户输入并按字母顺序分别打印每一行。我现在需要做的是能够删除 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/