2012-02-09 64 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

相關問題