c - 使用 stdlib.c 中的 qsort() 根据每个 *char 中的第三个字母对 C 中的字符串数组进行排序

标签 c arrays string qsort

我有一个像这样的 char* 数组

aob3l
gou5!
oib1k
llp6d

每 3 个索引一个数字。

我想使用 qsort() 根据这些数字对该列表进行排序。

排序后的列表看起来像这样

oib1k
aob3l
gou5!
llp6d

这就是我尝试实现它的方式。

qsort(string_mix, (size_t) (k - 1), sizeof(char), compare_at3);

我的compare_at3 函数如下所示

int compare_at3(const void* a, const void* b){
    static int k = 1;
    const char *ia = a;
    const char *ib = b;

    printf("In compare_at3 %d iter\n", k++);

    return ((ia[3] - '0') - (ib[3] - '0'));
}

我的问题是,

我做错了什么导致出现 SIGSEGV 段错误?

我最好的猜测是这行 const char *ia = a; 没有按照我的想法去做。

我在 *ia 中使用 * 所以我可以下标 int 作为它的索引,但也许 *ia 不是像 aob3l 这样的 char*

EDIT1:抱歉,我没有提到 string_mix 到底是什么。

它是问题中那些字符串的二维数组,定义如下

char* string_mix[MAX_NO_OF_STRINGS]

char s1_formatted[strlen(s1)];
char s2_formatted[strlen(s2)];
formatted(s1, s1_formatted);
formatted(s2, s2_formatted);

char s1_s[26][MAX_LEN_A];
char s2_s[26][MAX_LEN_B];

for(char ch = 'a'; ch <= 'z'; ch++) {
    sprintf(s1_s[ch - 'a'], "%c%d%s", ch, s1_n[ch - 'a'], t_stringer1[ch - 'l']);
    sprintf(s2_s[ch - 'a'], "%c%d%s", ch, s2_n[ch - 'a'], fs_stringer1[ch - 'o')]);
}

char* string_mix[MAX_NO_OF_STRINGS];

int k = 0;
for(int i = 0; i < 26; i++){
    if(s1_s[i][3] - '0' != 0){
        string_mix[k] = s1_s[i];
        k++;
    }
    else if(s2_s[i][3] - '0' != 0){
        string_mix[k] = s2_s[i];
        k++;
    }
}

最佳答案

qsort 的调用不正确。第三个参数应该是每个元素的大小。正确的调用可能是:

qsort(string_mix, (size_t) (k - 1), sizeof *string_mix, compare_at3);

或者,如果您愿意,假设 string_mix 是一个 char* 数组:

qsort(string_mix, (size_t) (k - 1), sizeof (char*), compare_at3);

关于c - 使用 stdlib.c 中的 qsort() 根据每个 *char 中的第三个字母对 C 中的字符串数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48301965/

相关文章:

c - Printf 不按程序顺序执行

javascript - 比较数组和json数据

php - 遍历数组(+100 个值)

c# - 字符串插值中的变量对齐组件

c - 我可以用什么来替代管道的 GetFileSize() ?

c - Fscanf 没有将文件中的 float 正确读取到链表中

PHP:将多维数组转换为一维数组

Java 字符串 : "String s = new String("silly");"

string - Powershell加入

c - 十六进制的 'E/e' 与十六进制浮点文字中的指数形式的 'E/e' 如何区分?