Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用stdlib.c中的qsort()根据每个*字符中的第三个字母对c中的字符串数组进行排序_C_Arrays_String_Qsort - Fatal编程技术网

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

使用stdlib.c中的qsort()根据每个*字符中的第三个字母对c中的字符串数组进行排序,c,arrays,string,qsort,C,Arrays,String,Qsort,我有一个像这样的字符数组 aob3l gou5! oib1k llp6d oib1k aob3l gou5! llp6d 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

我有一个像这样的字符数组

aob3l
gou5!
oib1k
llp6d
oib1k
aob3l
gou5!
llp6d
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'));
}
每三个索引中就有一个数字

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

排序后的列表如下所示

aob3l
gou5!
oib1k
llp6d
oib1k
aob3l
gou5!
llp6d
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'));
}
这就是我试图实现它的方式

qsort(string_mix, (size_t) (k - 1), sizeof(char), compare_at3);
我的
compare_at3
函数如下所示

aob3l
gou5!
oib1k
llp6d
oib1k
aob3l
gou5!
llp6d
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'));
}
我的问题是

获取SIGV segfault错误时我做错了什么

我最好的猜测是这行
const char*ia=a没有做我认为它正在做的事情

我在
*ia
中使用
*
,因此我可以下标
int
作为它的索引,但是
*ia
可能不是
字符*
aob3l
那样

EDIT1:对不起,我没有提到什么是真正的
string\u mix

这是问题中那些字符串的2D数组,定义如下

char*string\u mix[字符串的最大数量]

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++;
    }
}
chars1_格式化[strlen(s1)];
字符s2_格式化[strlen(s2)];
格式化(s1,s1_格式化);
格式化(s2,s2_格式化);
字符s1_s[26][MAX_LEN_A];
字符s2_s[26][MAX_LEN_B];

对于(char ch='a';ch您将一个空指针转换为一个char指针,并在不了解内存的情况下访问索引3,char指针指向函数内部。这是一种不好的样式,很可能是SIGSEGV的原因,因为您无法访问ia[3]

此外,你说,你想按照第三个字母排序……如果ia是指向字符数组的正确指针,那么这就是ia[2]


请发布您的代码…您是如何创建char*数组的?

如果您将空指针转换为char指针并访问索引3,而不知道内存的任何信息,char指针指向函数内部。这是错误的样式,很可能是SIGSEGV的原因,因为您无法访问ia[3]

此外,你说,你想按照第三个字母排序……如果ia是指向字符数组的正确指针,那么这就是ia[2]


请发布您的代码…您是如何创建char*数组的?

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

qsort(string_mix, (size_t) (k - 1), sizeof *string_mix, compare_at3);
或者,如果您愿意,假设
string\u mix
char*
的数组:

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

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

qsort(string_mix, (size_t) (k - 1), sizeof *string_mix, compare_at3);
或者,如果您愿意,假设
string\u mix
char*
的数组:

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

string\u mix
是指针数组-每个数组元素都是指针。
qsort()
调用需要传递元素的大小


获取SIGV segfault错误时我做错了什么

比较函数中假定的类型错误

compare函数接收2个指针。每个指针指向数组的一个元素。在OP中,这是指向指针的指针

int compare_at3(const void* a, const void* b){
  static int k = 1;
  printf("In compare_at3 %d iter\n", k++);

  // const char *ia = a;
  const char **ia = (const char **) a;
  const char **ib = (const char **) b;

  const char *sa = *ia;
  const char *sb = *ib;

  // Code could insure sa, sb are long enough
  if (sa[0] == '\0' || sa[1] == '\0' || sa[2] == '\0') Handle_OddCase();
  if (sb[0] == '\0' || sb[1] == '\0' || sb[2] == '\0') Handle_OddCase();

  // The classic compare indium is below, it never overflows.
  return (sa[3] > sb[3]) - (sa[3] < sb[3]);
}

string\u mix
是指针数组-每个数组元素都是指针。
qsort()
调用需要传递元素的大小


获取SIGV segfault错误时我做错了什么

比较函数中假定的类型错误

compare函数接收2个指针。每个指针指向数组的一个元素。在OP中,这是指向指针的指针

int compare_at3(const void* a, const void* b){
  static int k = 1;
  printf("In compare_at3 %d iter\n", k++);

  // const char *ia = a;
  const char **ia = (const char **) a;
  const char **ib = (const char **) b;

  const char *sa = *ia;
  const char *sb = *ib;

  // Code could insure sa, sb are long enough
  if (sa[0] == '\0' || sa[1] == '\0' || sa[2] == '\0') Handle_OddCase();
  if (sb[0] == '\0' || sb[1] == '\0' || sb[2] == '\0') Handle_OddCase();

  // The classic compare indium is below, it never overflows.
  return (sa[3] > sb[3]) - (sa[3] < sb[3]);
}

const char*ia=a;
更改为
const char*ia=(char*)a;
问题不在函数中。问题将出现在调用
qsort(string_mix,(size_t)(k-1),sizeof(char),compare_at3)中
。如果
string\u mix
是一个
char*
数组,并且
k-1
等于
string\u mix
中的元素数,那么调用将需要
qsort(string\u mix,(size\t)(k-1),sizeof(char*),compare.
(注意
sizeof
的操作数中的附加
*
)。但是,如果
string\u mix
k-1
是其他内容(您尚未指定),则所有赌注均无效。
sizeof(char)
看起来可疑,请发布一条。信息不足,因此无法可靠地回答此问题。如果您有包含20个字符的数组,请调用
qsort(string\u mix,4,5,compare\u at3)当你没有显示变量声明时,你就想对4个元素进行排序。因为没有显示变量的声明,什么是<代码> K<代码>?为什么你要对SigeZiT做隐式转换,你是否试图使用C++编译器?你的qRead肯定是错误的:列表中的每一个项目都是一个数组。de>char
或指向
char
的指针,而不是单个
char
。在比较函数中使用静态变量似乎非常可疑。将
const char*ia=a;
更改为
const char*ia=(char*)a;
问题不在函数中。它将出现在调用
qsort(string_mix,(size_t)(k-1),sizeof(char)中如果
string\u mix
是一个
char*
数组,并且
k-1
等于
string\u mix
中的元素数,那么调用将需要
qsort(string\u mix,(size\u t)(k-1),sizeof(char*),compare\u at3)
(请注意
sizeof
的操作数中的附加
*
)。但是,如果
string\u mix
k-1
是其他内容(您没有指定),则所有下注都将取消。
sizeof(char)
看起来有点可疑,请发布一个。没有足够的信息,因此没有可靠的方法来回答此问题。如果您的数组包含20个字符,请调用
qsort(字符串混合,4,5,比较3)
,它应该可以工作。当每个元素的长度为5字节时,您希望对4个元素进行排序。因为您不显示变量声明,所以没有人可以回答这个问题。
k
是什么?为什么要对大小进行隐式强制转换,您正在尝试吗