Почему 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;
}
Ответы
Ответ 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"
, которая должна (!!) правильно сравнивать.