C 使用qsort对无符号整数排序

C 使用qsort对无符号整数排序,c,qsort,uint32-t,C,Qsort,Uint32 T,我正在使用的程序获取一个文件,逐行解析它,然后将每一行更改为一个uint32,并将其添加到一个数组中。从这里开始,我应该使用qsort()对数组进行排序。 我按照我的想法编写了我的程序,但当我测试代码时,它表明所有新的uint32都是相同的值。这是因为我将字符串更改为uint32\t时出错吗?使用strtoul会更好吗? 最后一个问题,我的qsort的实现正确吗?(它编译并说它已经对事情进行了排序,但我不确定,因为我转换为uint_32显然是不正确的。 总之,代码如下: int main(int

我正在使用的程序获取一个文件,逐行解析它,然后将每一行更改为一个uint32,并将其添加到一个数组中。从这里开始,我应该使用qsort()对数组进行排序。 我按照我的想法编写了我的程序,但当我测试代码时,它表明所有新的uint32都是相同的值。这是因为我将字符串更改为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;
}
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
到a
uint32\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);