2012-02-09 34 views
0

我正在处理的程序需要一个文件并逐行解析,然后将每行更改为一个uint32_t并将其添加到数组中。从那里我应该用qsort()对数组排序。 我写了我的程序,我认为它应该是什么样的,但是当我测试代码时,它说所有新的uint32_ts都是相同的值。这是因为当我将字符串更改为uint32_t时出现错误?使用strtoul会更好吗? 最后一个问题,我的qsort的实现是否正确? (它编译,并表示,该公司已经整理东西,但我不知道,因为我转换到uint_32显然是不正确的 反正这里是代码:使用qsort对无符号整数进行排序

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

在另一个函数内部定义一个函数(这里''main'内的'compar')是一个gcc扩展。如果你希望你的代码是可移植的,你不应该使用它。只要将'compar'的定义移到'main'前即可。 – 2012-02-09 20:03:23

回答

1

当您阅读它们时,您不会解析这些行。将line转换为uint32_t只需在内存中获取该数组的地址。这就解释了为什么每行输出都是一样的。您可能需要拨打strtoul(line, NULL, 10)或类似的地址。

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

3
uint32_t t = (uint32_t) line; 

这不是将字符串转换为C.你一些正确的方式可能要使用strtoul来代替。而你的快速排序也是错误(错误数量的元素,错误的元素大小)。

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

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

您正在定义另一个函数中的compar函数。这是一个GCC扩展,你不应该使用它,除非你不打算携带。

+0

谢谢,这是完全正确的。你的解释比我读的其他东西好得多 – 2012-02-09 20:09:44

+0

“永远不要这样做!”你知道,那些在海湾合作委员会矿山里跋涉的穴居人工作很久很努力,以至于你可以无视他们的扩展;-) – 2012-02-09 21:21:36

+0

@SteveJessop你说得对,我不合格。 – cnicutar 2012-02-09 21:23:23

相关问题