Подтвердить что ты не робот

Почему string == 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;
}
4b9b3361

Ответ 1

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

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

с

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

Ответ 2

Это не так, потому что они не то же самое. Вы не "вырезали" строку, просто изменили ее в char.

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

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

Ответ 3

В этой строке

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

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

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

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