0

我正在处理的程序获取一个文件并逐行解析它,然后将每一行更改为 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;
}
4

2 回答 2

3
uint32_t t = (uint32_t) line;

这不是在 C 中将字符串转换为数字的正确方法。您可能想strtoul改用它。而且您的 qsort 也是错误的(元素数量错误,元素大小错误)。

parArray[lineCounter] = strtoul(line, NULL, 10);

/* ... */
qsort(parArray, lineCounter, sizeof(uint32_t), compar);

您正在compar另一个函数中定义您的函数。这是一个 GCC 扩展,除非您不计划可移植性,否则不应使用它。

于 2012-02-09T19:51:03.453 回答
1

当你阅读它们时,你并没有解析这些行。转换line为 auint32_t只需获取该数组在内存中的地址。这就解释了为什么输出的每一行都是相同的。你可能想打电话strtoul(line, NULL, 10)或类似的代替。

此外,您的第二个参数为qsort1。lineCounter在循环终止时具有正确的值:文件中的行数。通过添加一个,您通过读取数组中填充的值来引入未定义的行为。

于 2012-02-09T19:56:47.637 回答