Почему строка == сравнение строк не удается? - PullRequest
19 голосов
/ 10 июня 2011

Ниже приведен фрагмент кода того, что я сделал, может ли какое-то тело помочь мне там, где я его неправильно кодировал:

#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;
}

Ответы [ 3 ]

21 голосов
/ 10 июня 2011

Как уже говорили другие, строки не совпадают, так как одна - "test\0rtl", а другая - "test". Можно использовать == для сравнения std::string, так как оператор перегружен для равенства строк. Чтобы сделать то, что вы хотите, вы должны попробовать заменить

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

с

if(sep != string::npos) { name.resize(sep); }
13 голосов
/ 10 июня 2011

Это терпит неудачу, потому что они не одинаковы. Вы не «обрезали» строку, просто изменили символ в ней.

someName равно test, а name равно test\0rtl (std::string позволяет вам иметь нулевые символы ('\0') внутри)

Чтобы вырезать строку, вам нужно использовать std::string::resize или самостоятельно назначить подстроку, используя std::string::substr. Я бы порекомендовал resize.

9 голосов
/ 10 июня 2011

В этой строке

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

Вы изменяете строку на "test\0rtl".Std :: basic_string может содержать нулевые символы, поэтому строки не совпадают.Вместо этого вы можете использовать substr для усечения строки:

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

Это приведет к тому, что строка станет "test", что должно (!!) сравниваться правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...