# lab0 sort 結果檢查的錯誤 ###### tags: `2022Linux核心實作` ### 問題描述 在研究 lab0 的時候,發現了如果在排序的時候,加入了大寫或是數字,就會讓排序的檢查出錯,顯示 `ERROR: Not sorted in ascending order`,因此做了實驗想要檢查到底是在哪個部分出問題,因此將字符分為數字跟英文的大小寫進行測試。 ### 實驗 將大小寫與數字分別測試與組合之後,有了以下的七種組合,在七種組合中只有在大小寫同時出現,並且大寫的最後一個字母順序,比小寫的第一個字母的順序還要大時,會出現 `ERROR: Not sorted in ascending order` ,也就是當排序結果是 `C b` or `A W K g` 的組合時,會發生這個事件,實驗的詳細資料在底下 :::spoiler 詳細實驗資料 1. 單純小寫 ``` cmd> new l = [] cmd> ih a l = [a] cmd> ih b l = [b a] cmd> ih c l = [c b a] cmd> sort l = [a b c] ``` 2. 單純數字 ``` cmd> new l = [] cmd> ih 1 l = [1] cmd> ih 2 l = [2 1] cmd> ih 3 l = [3 2 1] cmd> sort l = [1 2 3] ``` 3. 單純大寫 ``` cmd> new l = [] cmd> ih A l = [A] cmd> ih B l = [B A] cmd> ih C l = [C B A] cmd> sort l = [A B C] ``` 4. 小寫混大寫 ``` l = [] cmd> ih a l = [a] cmd> ih A l = [A a] cmd> sort l = [A a] cmd> ih B l = [B A a] cmd> sort ERROR: Not sorted in ascending order l = [A B a] ``` 5. 小寫混數字 ``` cmd> new l = [] cmd> ih 1 l = [1] cmd> ih a l = [a 1] cmd> ih c l = [c a 1] cmd> ih 2 l = [2 c a 1] cmd> sort l = [1 2 a c] ``` 6. 數字混大寫 ``` cmd> free l = NULL cmd> new l = [] cmd> ih A l = [A] cmd> ih B l = [B A] cmd> ih 1 l = [1 B A] cmd> sort l = [1 A B] ``` 7. 全混 ``` cmd> new l = [] cmd> ih a l = [a] cmd> ih B l = [B a] cmd> ih 1 l = [1 B a] cmd> sort ERROR: Not sorted in ascending order l = [1 B a] ``` ::: ### 問題敘述與解決 在 do_sort 函數中,可以看見錯誤的訊息是由 `report(1, "ERROR: Not sorted in ascending order");` 所印出,可以知道有問題的部分是在底下的 `strcasecmp` 函數。 ```c= if (strcasecmp(item->value, next_item->value) > 0) { report(1, "ERROR: Not sorted in ascending order"); ok = false; break; } ``` 在[這個網頁中](https://man7.org/linux/man-pages/man3/strcasecmp.3.html)有提到 >The strcasecmp() function performs a byte-by-byte comparison of the strings s1 and s2, ignoring the case of the characters. It returns an integer less than, equal to, or greater than zero if s1 is found, respectively, to be less than, to match, or be greater than s2. 因此如果同時出現大小時, `strcasecmp(const char *s1, const char *s2);` 會單純比較字母的順序執行, 因此在排序好的情形之下,如果 s1 是順序 i 的大寫,s 是順序 j 的小寫(j < i),會讓這個錯誤產生。 因此,只要將 `strcasecmp` 這個函數,換成 `strcmp` 函數,利用 `strcmp` 單純比較 [ascii code](https://zh.wikipedia.org/wiki/ASCII) 的順序就可以解決了。