2013-05-29 159 views
4

嗨,任何人都可以告訴這個代碼有什麼問題嗎?無法將'std :: string'轉換爲'const char *

string s=getString(); //return string 

    if(!strcmp(s,"STRING")){ 
     //Do something 
    } 

在編譯時我收到錯誤,如

error: cannot convert ‘std::string’ to ‘const char*’ for argument ‘1’ to ‘int strcmp(const char*, const char*)’| 
+2

你想'if(s ==「STRING」)''。 'strcmp'是'const char *'版本。 (你可以使用'if(!strcmp(s.c_str(),「STRING」)',但不要) – BoBTFish

+1

你看過'strcmp'的文檔來看看它接受哪些參數嗎?當你已經有一個'std :: string'來定義'operator =='時,使用'strcmp'? – Jon

+5

@BoBTFish'(s ==「STRING」)'在這種情況下。 – ForEveR

回答

17

strcmp接受const char*作爲參數。您可以使用c_str方法:

if(!strcmp(s.c_str(),"STRING")) 

或者只是使用重載operator==std::string

if(s == "STRING") 
+0

我打算使用if(s ==「STRING」),但是可以使用if(getString()==「STRING」) – Haris

+0

當然,你可以。 – soon

+0

但是,當我這樣做的程序不進入如果循環.... – Haris

11

您需要使用s.c_str()得到std::string的C字符串版本,沿着線:

if (!strcmp (s.c_str(), "STRING")) ... 

但我不知道爲什麼你不會只使用:

if (s == "STRING") ... 

這是一個更具可讀性。

+0

你的測試是顛倒的。測試'!strcmp(...)'測試的是平等,而不是不平等。 – janm

+0

@stefan自從我離開我的評論以來,答案已被編輯。看看編輯歷史。 – janm

1

如果您想保留比較字符串的C方式,您必須使用std::stringc_str()成員函數,該成員函數爲您提供底層的char數組。

否則,您應該使用operator==它可以測試字符串和const char*之間的相等性。

5

與其他答案一樣,您可以使用std::string上的c_str()方法。

你也可以這樣做:

if (s == "STRING") { ... } 

哪個更清晰,不假裝你正在寫C.

1

必須使用c_str(),它應該解決您的問題。

+1

這是一種方式,但它是更糟糕的方式。 – BoBTFish

相關問題