![](/img/trans.png)
[英]Is there a way to code a qsort comparison function for unsigned integers without using lots of branching statements?
[英]Using qsort to sort unsigned integers
我正在处理的程序将一个文件并逐行解析,然后将每一行更改为uint32_t并将其添加到数组中。 从那里我应该用qsort()对数组进行排序。 我按照我的原意编写了程序,但是当我测试代码时,它说的是所有新的uint32_ts都是相同的值。 当我将字符串更改为uint32_t时,这是因为错误吗? 使用strtoul会更好吗? 最后一个问题,我的qsort的实现正确吗? (它编译并说它已经对事物进行了排序,但是我不确定,因为我转换为uint_32显然是不正确的。无论如何,这里是代码:
int main(int argc, char* argv[]){
char const* const fileName = argv[1];
FILE* file = fopen(fileName, "r"); // should check the result
char line[256];
uint32_t parArray[256];
int compar(const void *a, const void *b){
const unsigned long long *x = a, *y = b;
if(*x > *y)
return 1;
else
return(*x < *y) ? -1: 0;
}
int lineCounter = 0; // starts at 0 for the array
while(fgets(line, sizeof(line), file)){
// parse all info here
uint32_t t = (uint32_t) line;
// build the array
parArray[lineCounter]=t;
lineCounter++;
printf("Original: %s, Unsigned Int: %u\n", line,t);
}
qsort(&parArray[0],lineCounter+1,sizeof(uint32_t*),compar);
int i;
for(i=0;i<lineCounter;i++){
printf("%u\n",parArray[i]);
}
return 0;
}
uint32_t t = (uint32_t) line;
这不是在C中将字符串转换为数字的正确方法。您可能想改用strtoul
。 而且您的qsort也是错误的(错误的元素数量,错误的元素大小)。
parArray[lineCounter] = strtoul(line, NULL, 10);
/* ... */
qsort(parArray, lineCounter, sizeof(uint32_t), compar);
您正在另一个函数中定义compar
函数。 这是GCC扩展程序,除非您不计划可移植性,否则不要使用它。
您在阅读时不会解析行。 将line
uint32_t
转换为uint32_t
只是在内存中获取该数组的地址。 这就解释了为什么输出的每一行都是相同的。 您可能想调用strtoul(line, NULL, 10)
或类似的名称。
另外,您的qsort
的第二个参数也被关闭了一个。 循环终止时, lineCounter
具有正确的值:文件中的行数。 通过添加一个,您将通过读取数组中的填充值来引入未定义的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.