我正在尝试使用qsort
对字符数组进行排序。我不明白为什么这不起作用。我有一个指向比较函数的指针man
页指定。有人可以告诉我出了什么问题吗?谢谢。我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmpfunc( const void *a, const void *b) {
return *(int*)a - *(int*)b;
}
void AlphabetSoup( char str[] ) {
qsort(str, (size_t) strlen(str), (size_t) sizeof(char), cmpfunc);
printf("%s\n", str);
}
int main() {
char str1[] = "bcead";
AlphabetSoup(str1);
return 0;
}
输出:dabce
当我期待的时候abcde
.
简单的错误。
Use char*
代替int*
in cmpfunc
.
int cmpfunc( const void *a, const void *b) {
return *(char*)a - *(char*)b;
}
当你使用int*
, 代替char*
,指向的地址a
被解释为一个地址int
, not a char
.
您的输入包含以下字符:
+---+---+---+---+---+
| b | c | e | a | d |
+---+---+---+---+---+
以十六进制表示,这些是:
+----+----+----+----+----+
| 62 | 63 | 65 | 61 | 64 |
+----+----+----+----+----+
^ ^
| |
a b
如果你对待指向的地址a
and b
as int*
,假设int
在你的系统中占用 4 个字节,*(int*)a
可以是
0X62*2^24 + 0X63*2^16 + 0X65*2^8 + 0X61
or
0X62 + 0X63*2^8 + 0X65*2^16 + 0X61*2^24
取决于您使用的是大端系统还是小端系统。
您可以类似地计算什么*(int*)b
将会。正如您所看到的,您已经遇到了意想不到的数字比较。当您开始比较输入的其他字节位置处的值时,您还使用了不应该使用的内存,并且您正在达到未定义行为的领域。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)