天天看點

c++ char字元相等比較_字元串使用的小誤區

c++ char字元相等比較_字元串使用的小誤區
最近代碼評審時候遇到的這些坑。

咋一看代碼貌似沒什麼問題,簡單的字元串比較。可是仔細看了看感覺哪裡不對勁,運作結果卻是一直是輸出"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";
           

正确做法:

  1. 直接使用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";
           
  1. 使用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);