比较两个ASCII字符的正确方法是什么?

时间:2015-10-29 04:22:48

标签: c arrays pointers

老实说,这是我作业中问题的一部分。但是,我已经尽力而为,但仍未获得预期的输出。所以我来这里寻求帮助。

现在我需要对缓冲区中的单词进行排序,以便它们按升序显示。每个单词都以空格作为分隔符结束,空格不参与比较。

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++;
  }
}

我有掩码的每个字节^的原因是缓冲区中的这些字是frobnicated(XOR为42)。所以在进行比较之前,我必须将这些字节反转为原始状态。

我的问题是我的代码出了什么问题?为什么结果输出不是按升序排列的?我的比较方法有问题吗?

我真诚地期待有人给予帮助...... 如有必要,我可以添加更多代码..

1 个答案:

答案 0 :(得分:2)

你有:

int mask = 0x00101010;

然后你说:

  

缓冲区中的这些字是frobnicated(XOR为42),因此我必须在进行比较之前将这些字节反转为其原始状态。

但是,0x00101010不是42。如果该数字是二进制数字,则为42,但它是十六进制数。

您可以使用:

int mask = 42;

int mask = 0x2A;