我有一个像这样的 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/