Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.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
在C中使用qsort()后,是否会遇到奇怪的字符_C_Arrays_String_Sorting - Fatal编程技术网

在C中使用qsort()后,是否会遇到奇怪的字符

在C中使用qsort()后,是否会遇到奇怪的字符,c,arrays,string,sorting,C,Arrays,String,Sorting,我正在学习使用C的qsort()对字符数组进行排序,chars[]=“atlantic”。返回qsort()后,我打印出我的s,但只得到了不可读的字符。我认为我的compare()是正确的,因为qsort()需要的只是使用它来确定*a是否在*b之前/之后。是否有人知道是什么原因导致该行printf(“之后:%s\n”,s)不工作?谢谢 int compare(const void * a, const void * b){ return *(char*)a - *(char*)b; } vo

我正在学习使用C的qsort()对字符数组进行排序,
chars[]=“atlantic”
。返回qsort()后,我打印出我的
s
,但只得到了不可读的字符。我认为我的compare()是正确的,因为qsort()需要的只是使用它来确定*a是否在*b之前/之后。是否有人知道是什么原因导致该行
printf(“之后:%s\n”,s)不工作?谢谢

int compare(const void * a, const void * b){
  return *(char*)a - *(char*)b;
}
void doWork(char* s) {
  printf("Before: %s\n", s);
  qsort(s, strlen(s), sizeof(char *), compare);
  printf("After: %s\n", s); 
}
您似乎在告诉
qsort
此处您正在排序的类型是
char*
而不是
char
。除非指针的大小与字符的大小完全相同,否则不会有好结果:-)

您应该使用:

qsort(s, strlen(s), sizeof(char), compare);
或者,由于
sizeof(char)
始终是
1
,因此您可以通过以下操作:

qsort(s, strlen(s), 1, compare);
尽管为了尽量减少将来需要更改类型时的代码更改,您可以直接使用变量而不是类型:

qsort(s, strlen(s), sizeof(*s), compare);

如果有任何更改:

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

int compare(const void * a, const void * b){
    return *(char*)a - *(char*)b;
}

void doWork(char* s) {
    printf("Before: %s\n", s);
    qsort(s, strlen(s), sizeof(*s), compare);
    printf("After:  %s\n", s);
}

int main (void) {
    char s[] = "atlantic";
    doWork(s);
    return 0;
}
您似乎在告诉
qsort
此处您正在排序的类型是
char*
而不是
char
。除非指针的大小与字符的大小完全相同,否则不会有好结果:-)

您应该使用:

qsort(s, strlen(s), sizeof(char), compare);
或者,由于
sizeof(char)
始终是
1
,因此您可以通过以下操作:

qsort(s, strlen(s), 1, compare);
尽管为了尽量减少将来需要更改类型时的代码更改,您可以直接使用变量而不是类型:

qsort(s, strlen(s), sizeof(*s), compare);

如果有任何更改:

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

int compare(const void * a, const void * b){
    return *(char*)a - *(char*)b;
}

void doWork(char* s) {
    printf("Before: %s\n", s);
    qsort(s, strlen(s), sizeof(*s), compare);
    printf("After:  %s\n", s);
}

int main (void) {
    char s[] = "atlantic";
    doWork(s);
    return 0;
}

问题是您正在将
sizeof(char*)
传递到
qsort
中,其中
sizeof(char)
是合适的

使用


问题是您正在将
sizeof(char*)
传递到
qsort
中,其中
sizeof(char)
是合适的

使用


s
的元素不是类型
char*
,因此它们没有
sizeof(char*)
,而是使用
sizeof(char)

qsort(s, strlen(s), sizeof(char), compare); 

s
的元素不是类型
char*
,因此它们没有
sizeof(char*)
,而是使用
sizeof(char)

qsort(s, strlen(s), sizeof(char), compare); 

sizeof*s
将是另一个选项,如果该代码以后适应
wchar\u t
strings,则可能有用
sizeof*s
将是另一个选项,如果该代码以后适应
wchar\u t
字符串,则可能有用