2011-10-13 24 views
3

我正在通過遺留代碼修復問題,發現以下列方式檢查c_str不起作用。但是,如果我改變比較string.empty()它的作品。所以我的問題解決了,但我不知道爲什麼c_str比較不起作用。任何想法爲什麼?
謝謝!
我正在使用-gcc版本4.1.2 20080704(Red Hat 4.1.2-46)。c_str()== NULL不起作用

#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; 
    } 
} 

輸出是─
串說我空虛

+0

真的嗎?我的意思是一個空不是NULL,NULL!=「」。 – daniel

+2

我認爲標準實際*要求* std :: string :: c_str()'返回一個非空指針。 –

+2

空字符串和根本沒有字符串是兩個不同的東西。 –

回答

4

a在這種情況下不爲空。字符串對象有一個內部指針,它不是null,該指針是c_str返回的內容。

爲了驗證這一點,嘗試

printf("%zu\n", a.c_str()); 

,你會得到一個真實的地址。

1

在猜測,有一個空字符串,.c_str()可能是返回一個非空字符串,一些內存,設置第一個字節'\ 0'。 IOW,你得到一個零長度的字符串,而不是一個空指針。

4

以空字符終止的字符串永遠不會是NULL,它始終指向具有空終止符的有效內存。空字符串只是一個\0。由於c_str()被約定返回一個以空字符結尾的字符串,因此它永遠不會返回NULL。測試空字符串的正確方法的確是empty()

1

""不是空字符串,它是一個空字符串。在內存中,它將包含一個字符,\0。另一方面,空字符串不包含任何字符:它甚至不指向任何內容。兩種完全不同的「空」類型,只有其中一種你測試。

1

std :: string不需要使用NULL來存儲空字符串。

另一方面,需要c_str()才能返回指針指向以空字符結尾的字符序列。該序列的最小內存大小爲1('\ 0'所需的內存大小)。所以它不能爲NULL。

檢查std :: string是否爲空的正確方法是調用empty()方法。

您也可能會注意到,在下面的代碼:

char a[] = ""; 

變量一個不爲空。