2011-10-13 15 views
3

問題を解決するために従来のコードを実行していて、次のようにc_strをチェックすると機能しないことがわかりました。しかし、私が比較をstring.empty()に変更しても動作します。だから私の問題は解決されますが、なぜc_strの比較がうまくいかないのか分かりません。理由は何ですか?
ありがとうございます!
私は - gcc version 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; 
    } 
} 

出力
文字列が空の文字列で、.c_str()はおそらくに設定された第1バイトで、いくつかのメモリに非NULL文字列を返して、私は推測で

+0

?私は、NULLがNULLでないことを意味します、NULL!= ""。 – daniel

+2

標準では、実際には、* null以外のポインタを返すために* 'std :: string :: c_str()'が必要だと思います。 –

+2

空の文字列と文字列はまったく異なる2つのものです。 –

答えて

4

aはこの場合nullではありません。文字列オブジェクトにはnullではない内部ポインタがあり、そのポインタはc_strが返すポインタです。これを確認するには

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

を試してみて、あなたは、実際のアドレスを取得します。

1

空だと言うが - '\ 0' IOW、ヌルポインタではなく、長さゼロの文字列を取得しています。

4

null終了文字列は決してNULLではありません。ヌル終端文字を持つ有効なメモリを常に指します。空の文字列はただ一つの\0です。 c_str()はnullで終わる文字列を返すように契約しているので、決してNULLを返すことはできません。空の文字列をテストする正しい方法は、実際にはempty()です。

1

""は空の文字列ではありません。メモリには、単一の文字、\0が含まれます。一方、ヌル文字列には文字は含まれていません。何も指していません。 2つの完全に異なるタイプの「空」。そのうち1つのみをテストします。

1

std :: stringは、空の文字列を格納するためにNULLを使用する必要はありません。

一方、NULL終了の文字列へのポインタをに戻すには、c_str()が必要です。このシーケンスの最小メモリサイズは1です( '\ 0'に必要です)。したがって、NULLにすることはできません。

std :: stringが空であるかどうかを確認する正しい方法は、empty()メソッドを呼び出すことです。

また、次のコードでそれに気づくことがあります。

char a[] = ""; 

変数がNULLではありません。