2011-06-10 48 views
19

以下是我所做的代碼片段,可一些身體幫我在哪裏,我錯編碼是:爲什麼string ==字符串比較失敗?

#include<iostream> 
using namespace std; 

void modifyName(string &name) 
{ 
    size_t sep = string::npos; 
    sep = name.find_first_of("."); 

    if(sep != string::npos) { name[sep] = '\0'; } 
} 

int main() 
{ 
    string name("test.rtl"); 
    string someName("test"); 
    modifyName(name); 

    if(someName == name) //Failing?? 
     cout<<"MATCHED"<<endl; 
    return 0; 
} 
+4

+1更換

if(sep != string::npos) { name[sep] = '\0'; } 

短暫的,獨立的例子 – Flexo 2011-06-10 08:02:11

+1

當我試圖調試這我知道,COUT << name.c_str ()<<「...」<< name << endl;輸出:test ... testrtl所以cout運算符'<<'在字符串和char *對象上的工作方式不同。只是覺得它值得分享:)。 – pankiii 2011-06-10 08:18:34

+1

當你使用'name.c_str()'你正在從'std :: string'創建一個c風格的字符串時--c風格的字符串是空終止的。正如你在字符串中插入了一個null,這會在c風格時終止它。但是'std :: string'可以包含任何值,包括null - 但是null通常是不可打印的,所以不會被輸出......但也不表示字符序列的結束。 – icabod 2011-06-10 09:13:03

回答

21

正如其他人所說,字符串不匹配,因爲一個是"test\0rtl",另一個是"test"。對於std::string比較,可以使用==,因爲運算符爲字符串相等而過載。做你想做什麼,你應該嘗試與

if(sep != string::npos) { name.resize(sep); } 
+1

+1因爲使用調整大小而不是我的建議(substr)至少應該更快,因爲不使用賦值。 – icabod 2011-06-10 08:06:25

+0

感謝此解決方法正常工作 – pankiii 2011-06-10 08:09:22

+5

@pankiii:我不會稱之爲「解決方法」 - 這是您正在尋找的正確方法。 – 2011-06-10 08:47:32

13

它的失敗,因爲他們是不一樣的。你有沒有「一刀切」的字符串,只是改變了它的字符。

someNametest,而nametest\0rtlstd::string讓你擁有零字符('\0')內)

要剪切的字符串,你需要使用std::string::resize或自行分配的子串,使用std::string::substr 。我建議resize

9

在這一行

if(sep != string::npos) { name[sep] = '\0'; } 

要修改的字符串是"test\0rtl"。 std :: basic_string可以包含空字符,所以字符串不一樣。你可以使用substr截斷字符串,而不是:

if(sep != string::npos) { name = name.substr(sep); } 

這將導致字符串成爲"test",這應該(!!)比較正確。