Разница в сравнении строки .c_str () и обычной строки

0

Я хотел знать, какая разница между этими двумя кодами. Когда я использую.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();
        }
}
  • 3
    С помощью c_str () вы сравниваете указатели с символами, а не с фактической последовательностью символов.
  • 0
    c_str() возвращает const char * , и сравнение указателей имеет значение «true», только когда точки указывают на одну и ту же область памяти (что не является тем, что вы хотите). Вы хотите сравнить содержимое.
Показать ещё 7 комментариев
Теги:

3 ответа

3
Лучший ответ

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, если массивы занимают разные области памяти.

  • 4
    strcpy не прав .. не должно ли это быть одним из: strcmp , stricmp , strcasecmp .
  • 4
    Кроме того, если у вас есть std::string , зачем вообще беспокоиться о strcmp ?
Показать ещё 7 комментариев
4

Таким образом, в основном происходит то, что происходит .c_str() возвращает const char*. Это вызовет operator == для сравнения указателей, а не содержимого строки. Так как оба эти явно не указывают на одно и то же место памяти (поскольку "PAUSE" является строковым литералом), это всегда будет ложным.

  • 0
    -1: c_str() не возвращает char* . У вас также есть некоторые грамматические ошибки в вашем посте.
  • 0
    +1: теперь лучше
1

Этот код:

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, это лучший способ сделать сравнение (и, как вы говорите, "он работает").

Ещё вопросы

Сообщество Overcoder
Наверх
Меню