Я хотел знать, какая разница между этими двумя кодами. Когда я использую.c_str(), он не работает
std::vector<std::pair<std::string, std::string> >::iterator it
for(;it!=MySet.end();++it)
{
if(std::get<1>(*it).c_str()=="PAUSE") //Why it works only with std::get<1>(*it) and not with std::get<1>(*it).c_str()
{
TempDefaultVan = std::get<0>(*it).c_str();
}
}
std::get<1>(*it)
возвращает объект типа std :: string. Этот класс имеет operator ==
перегрузки operator ==
для сравнения объектов типа std :: string с массивами символов.
std::get<1>(*it).c_str()
возвращает массив символов. В массивах нет оператора сравнения. Чтобы сравнить массивы символов, вы должны использовать стандартную функцию C std::strcmp
Так что вы могли бы написать
if( std::strcmp( std::get<1>(*it).c_str(), "PAUSE" ) == 0 )
Если вы напишете просто как
if(std::get<1>(*it).c_str()=="PAUSE")
то компилятор будет сравнивать два указателя, потому что он преобразует массивы в указатели на свои первые элементы в таких выражениях. И в результате это выражение будет всегда равно false, если массивы занимают разные области памяти.
strcpy
не прав .. не должно ли это быть одним из: strcmp
, stricmp
, strcasecmp
.
std::string
, зачем вообще беспокоиться о strcmp
?
Таким образом, в основном происходит то, что происходит .c_str()
возвращает const char*
. Это вызовет operator ==
для сравнения указателей, а не содержимого строки. Так как оба эти явно не указывают на одно и то же место памяти (поскольку "PAUSE"
является строковым литералом), это всегда будет ложным.
c_str()
не возвращает char*
. У вас также есть некоторые грамматические ошибки в вашем посте.
Этот код:
std::get<1>(*it).c_str()=="PAUSE"
сравнивает два const char *
, которые указывают на строки. Это не то, что вы обычно хотите при сравнении строк, поскольку оно будет оценивать только true, когда они указывают на одно и то же место в памяти.
Этот код:
std::get<1>(*it)=="PAUSE"
Будет использовать std::string::operator==
для сравнения содержимого std::string
std::get<1>(*it)
с содержимым "PAUSE"
. Если у вас вместо этого есть два значения char *
, вы можете использовать strcmp
, но поскольку у вас есть std::string
, это лучший способ сделать сравнение (и, как вы говорите, "он работает").
c_str()
возвращаетconst char *
, и сравнение указателей имеет значение «true», только когда точки указывают на одну и ту же область памяти (что не является тем, что вы хотите). Вы хотите сравнить содержимое.