C 使用qsort对无符号整数排序
我正在使用的程序获取一个文件,逐行解析它,然后将每一行更改为一个uint32,并将其添加到一个数组中。从这里开始,我应该使用qsort()对数组进行排序。 我按照我的想法编写了我的程序,但当我测试代码时,它表明所有新的uint32都是相同的值。这是因为我将字符串更改为uint32\t时出错吗?使用strtoul会更好吗? 最后一个问题,我的qsort的实现正确吗?(它编译并说它已经对事情进行了排序,但我不确定,因为我转换为uint_32显然是不正确的。 总之,代码如下:C 使用qsort对无符号整数排序,c,qsort,uint32-t,C,Qsort,Uint32 T,我正在使用的程序获取一个文件,逐行解析它,然后将每一行更改为一个uint32,并将其添加到一个数组中。从这里开始,我应该使用qsort()对数组进行排序。 我按照我的想法编写了我的程序,但当我测试代码时,它表明所有新的uint32都是相同的值。这是因为我将字符串更改为uint32\t时出错吗?使用strtoul会更好吗? 最后一个问题,我的qsort的实现正确吗?(它编译并说它已经对事情进行了排序,但我不确定,因为我转换为uint_32显然是不正确的。 总之,代码如下: int main(int
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;
}
intmain(intargc,char*argv[]){
char const*const fileName=argv[1];
FILE*FILE=fopen(文件名,“r”);//应检查结果
字符行[256];
uint32_t parArray[256];
整数比较(常数无效*a,常数无效*b){
常量无符号长*x=a,*y=b;
如果(*x>*y)
返回1;
其他的
返回(*x<*y)?-1:0;
}
int lineCounter=0;//数组从0开始
while(fgets(行、sizeof(行)、文件)){
//在这里解析所有信息
uint32_t=(uint32_t)行;
//构建阵列
并行[线路计数器]=t;
lineCounter++;
printf(“原始:%s,未签名整数:%u\n”,第行,t);
}
qsort(&parArray[0],lineCounter+1,sizeof(uint32_t*),compar;
int i;
对于(i=0;i
在C语言中,这不是将字符串转换为数字的正确方法。您可能想改用strtoul
。而且您的qsort也是错误的(错误的元素数量,错误的元素大小)
您正在另一个函数中定义compar
函数。这是一个GCC扩展,除非您不打算移植,否则不应该使用它
在C语言中,这不是将字符串转换为数字的正确方法。您可能想改用strtoul
。而且您的qsort也是错误的(错误的元素数量,错误的元素大小)
您正在另一个函数中定义您的compar
函数。这是一个GCC扩展,除非您不打算移植,否则不应该使用它。您没有在读取行时解析行。将line
强制转换为uint32\t
只需在内存中获取该数组的地址。这解释了为什么每个li其中一个输出相同。您可能希望调用strtoul(line,NULL,10)
或类似的函数
另外,qsort
的第二个参数关闭了一个。lineCounter
在循环终止时具有正确的值:文件中的行数。通过添加一个参数,您通过读取数组中填充的值来引入未定义的行为。您在读取行时没有解析行。强制转换line
到auint32\u t
仅获取内存中该数组的地址。这解释了为什么输出的每一行都是相同的。您可能希望调用strtoul(line,NULL,10)
或类似的函数
另外,qsort
的第二个参数关闭了一个。lineCounter
在循环终止时具有正确的值:文件中的行数。通过添加一个参数,您通过读取数组中填充的值来引入未定义的行为。在另一个函数中定义函数(此处compar
位于main
的内部)是一个gcc扩展。如果希望代码可移植,则不应使用此扩展。只需将compar
的定义移动到main
的前面。在另一个函数中定义函数(此处compar
位于main
的内部)是一个gcc扩展。如果你希望你的代码是可移植的,你不应该使用它。只要把你的compar
定义移到main
前面就行了。谢谢你的解释完全正确。你的解释比我读到的“永远不要那样做!”你知道,在GCC矿山辛勤劳作的troglodytes人工作了很长时间,这样你就可以立即取消他们的扩展;-)或者至少是lambda-lifted。谢谢你,这是完全正确的。你的解释比我读到的“永远不要那样做!”你知道,在海湾合作委员会(GCC)矿山辛勤劳作的特罗格洛迪人工作了很长时间,这样你就可以立即解散他们的扩展;-)或者至少兰姆达解除了。
uint32_t t = (uint32_t) line;
parArray[lineCounter] = strtoul(line, NULL, 10);
/* ... */
qsort(parArray, lineCounter, sizeof(uint32_t), compar);