![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SMkNTMhlDZ3gTOyAzMxkDN2gzNzYTO4E2NkNWM3MGZk9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
最近代碼評審時候遇到的這些坑。
咋一看代碼貌似沒什麼問題,簡單的字元串比較。可是仔細看了看感覺哪裡不對勁,運作結果卻是一直是輸出"UTF-32"。
這裡有個誤區是,字元串(char *
)是不能直接比較的 ,下列代碼比較的是字元串的位址,這樣就會導緻它們字元串位址永遠不會相等就一直輸出的是"UTF-32"結果了。
string str("gbk");
if (str.c_str() == "gbk")
cout << "GBK";
else if (str.c_str() == "utf-8")
cout << "UTF-8";
else if (str.c_str() == "utf-16")
cout << "UTF-16";
else
cout << "UTF-32";
正确做法:
- 直接使用string對象比較 。
string str("gbk");
if (str == string("gbk"))
cout << "GBK";
else if (str == string("utf-8"))
cout << "UTF-8";
else if (str == string("utf-16"))
cout << "UTF-16";
else
cout << "UTF-32";
- 使用strcmp函數比較字元串 。
string str("gbk");
if (strcmp(str.c_str(), "gbk") == 0)
cout << "GBK";
else if (strcmp(str.c_str(), "utf-8") == 0)
cout << "UTF-8";
else if (strcmp(str.c_str(), "utf-16") == 0)
cout << "UTF-16";
else
cout << "UTF-32";
下列代碼運作後直接段錯誤,原因是釋放了一個非法的記憶體位址(靜态存儲區)。慶幸的是在C++11中,編譯器會直接報錯。
char *str = (char *)malloc(32);
str = "Hello world!";
free(str);
正确做法(使用strcpy複制字元串):
char *str = (char *)malloc(32);
strcpy(str, "Hello world!");
free(str);