老实说,这是我作业中问题的一部分。但是,我已经尽力而为,但仍未获得预期的输出。所以我来这里寻求帮助。
现在我需要对缓冲区中的单词进行排序,以便它们按升序显示。每个单词都以空格作为分隔符结束,空格不参与比较。
char *input = (char*) malloc(bufferSize*sizeof(char));
//这是包含来自stdin的单词的缓冲区。
然后,我使用一个指针数组来存储每个单词的指针:
char **arrayPtr = (char**) malloc(numLines*sizeof(char*));
char *ptr = input;
for(int i = 0; i < numLines; i++){ //numLines is equal to number of words.
arrayPtr[i] = ptr;
while(*ptr != ' ')
ptr++;
ptr++;
}
之后,我打电话给qsort用我自己的功能排序单词&#39; frobcmp&#39;进行比较。
qsort(arrayPtr, numLines, sizeof(char*), frobcmp);
int frobcmp(const void *a, const void *b){
const char *x = *(const char**)a;
const char *y = *(const char**)b;
while(1){
if(*x == ' ' && *y == ' ')
return 0;
else if(*x == ' ')
return -1;
else if(*y == ' ')
return 1;
int mask = 0x00101010;
int byteX = (int) *x;
int byteY = (int) *y;
int diff = (byteX ^ mask) - (byteY ^ mask);
if(diff) return diff;
x++;
y++;
}
}
我的问题是我的代码出了什么问题?为什么结果输出不是按升序排列的?我的比较方法有问题吗?
我真诚地期待有人给予帮助...... 如有必要,我可以添加更多代码..
答案 0 :(得分:2)
你有:
int mask = 0x00101010;
然后你说:
缓冲区中的这些字是frobnicated(XOR为42),因此我必须在进行比较之前将这些字节反转为其原始状态。
但是,0x00101010
不是42
。如果该数字是二进制数字,则为42
,但它是十六进制数。
您可以使用:
int mask = 42;
或
int mask = 0x2A;