【问题标题】:Sorting values from argv对 argv 中的值进行排序
【发布时间】:2015-04-23 10:42:02
【问题描述】:

我在 argv 中丢失了字符串,我想对其进行排序。我正在使用 strcmp 和 strcpy 进行排序。

如何将 const char** 转换为可在排序函数中使用的 char 数组?

void sort(const char** sl, int n) {

   char s[n][20], t[20];
   int i, j;

   for (i = 1; i < n; i++) {
      for (j = 1; j < n; j++) {
         if (strcmp(s[j - 1], s[j]) > 0) {
            strcpy(t, s[j - 1]);
            strcpy(s[j - 1], s[j]);
            strcpy(s[j], t);
         }
      }
   }

   printf("\nStrings in order are : ");
   for (i = 0; i < n; i++)
      printf("\n%s", s[i]);

}

int main(int argc, const char** argv)
{
  sort(argv+1, argc-1);
  printf("Files: %i\n", argc-1);
  return 0;
}

【问题讨论】:

  • 您有undefined behavior,因为您将s1 中的字符串与未初始化 数组s[j] 进行比较。
  • 我还没有比较任何东西,因为我不知道如何从 const char** 转换为 char[]...
  • sort中你有strcmp(s[j - 1], s[j])这个表达式,当你第一次调用函数s[j]时会被初始化,导致UB。

标签: c sorting


【解决方案1】:

您可以使用标准的qsort 函数实现您想要的。

代码:

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

int string_cmp(const void *a, const void *b)
{
    const char **ia = (const char **)a;
    const char **ib = (const char **)b;
    return strcmp(*ia, *ib);
}

void print_args(int argc, char** argv) {
    int i = 0;
    for(i = 0; i < argc; ++i) {
        printf("%s\n", argv[i]);
    }
}

int main(int argc, char** argv) {
    printf("original:\n");
    print_args(argc, argv);

    qsort(argv, argc, sizeof(char *), string_cmp);

    printf("sorted:\n");
    print_args(argc, argv);
    return EXIT_SUCCESS;
}

测试:

$ ./String-Sort 432 123456 bhello ahello ch

输出:

original:
./String-Sort
432
123456
bhello
ahello
ch
sorted:
./String-Sort
123456
432
ahello
bhello
ch

但是如果仍然想要自己的函数你只需要初始化数组s,像这样

for(i = 0; i < n; ++i) {
    strcpy(s[i], sl[i]);
}

在你的排序循环之前添加这个。但是你需要确保每个输入字符串的长度小于20,或者你需要为字符串分配更多的内存。

【讨论】:

  • 非常感谢,但是我需要它不起作用,我需要排序的字符串是这样的 a.1 a.2 a.3 a.4 - a.10 和它总是被排序为 a.1 a.10 a.2....
  • @Merl 这就是strcmp 的工作方式,通过您的方法,您仍然会收到这样的结果。使用strverscmp 实现对数比较。
猜你喜欢
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 2015-06-03
  • 1970-01-01
  • 2020-09-10
相关资源
最近更新 更多