簡體   English   中英

c_str()== NULL不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM