[英]c_str() == NULL not working
我正在通過遺留代碼來修復問題,並發現以下列方式檢查c_str不起作用。 但是,如果我將比較更改為string.empty()則可行。 所以我的問題解決了,但我不確定為什么c_str比較不起作用。任何想法為什么?
謝謝!
我正在使用 - gcc版本4.1.2 20080704(Red Hat 4.1.2-46)。
#include <iostream>
using namespace std;
int main()
{
string a="";
if (a.c_str() == NULL)
{
cout <<"char says empty"<<endl;
}
if (a.empty())
{
cout << "string says empty"<<endl;
}
}
輸出是 -
字符串說我是空的
在這種情況下, a
不為空。 字符串對象有一個內部指針,該指針不為null
,該指針是c_str返回的指針。
要驗證這一點,請嘗試
printf("%zu\n", a.c_str());
你會得到一個真實的地址。
空終止字符串永遠不會為NULL
,它始終指向具有空終止符的有效內存。 空字符串只是一個\\0
。 由於c_str()
被收縮以返回以空字符結尾的字符串,因此它永遠不會返回NULL
。 測試空字符串的正確方法確實是empty()
。
猜測,使用空字符串時, .c_str()
可能.c_str()
非NULL字符串返回到某個內存,第一個字節設置為'\\ 0'。 IOW,你得到一個零長度的字符串,而不是一個空指針。
""
不是空字符串,它是一個空字符串。 在內存中,它將包含單個字符\\0
。 另一方面,空字符串不包含任何字符:它甚至不指向任何字符。 兩種完全不同類型的“空”,其中只有一種是你測試的。
std :: string不需要使用NULL來存儲空字符串。
另一方面,c_str()需要返回指向以null結尾的字符序列的指針 。 此序列的最小內存大小為1('\\ 0'所需的內存大小)。 所以它不能是NULL。
檢查std :: string是否為空的正確方法是調用empty()方法。
您可能還會注意到以下代碼:
char a[] = "";
變量a不是NULL。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.