2011-06-10 96 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",这应该(!!)比较正确。