сравнить const char * с strcmp

Я сравниваю const char * со строкой, и по какой-то причине это всегда удается.

    if (std::strcmp(t->detectColor->name, "ghghjg") != 0) {
        printf("XXXXXXXXXXX\n");
        // check if it was allready a sequencer
        if (std::strcmp(t->className, "IM_SURE_IT_CANT_BE_THIS") != 0) {
          printf("what is going on?\n");

ИмяDetectColor всегда что-то вроде зеленого или синего, а t->className, например, "ofxDTangibleBase". Тем не менее он печатает

XXXXXXXXXXX
what is going on?

в консоли. Как я могу получить действительное сравнение?


person clankill3r    schedule 14.11.2013    source источник
comment
Хорошо ли спалось? Исходя из этого сообщения: stackoverflow. com/questions/2931704/ Это довольно простая ошибка.   -  person clankill3r    schedule 14.11.2013


Ответы (2)


Согласно cplusplus.com:

Возвращает интегральное значение, указывающее связь между строками: Нулевое значение указывает, что обе строки равны. Значение больше нуля указывает, что первый несоответствующий символ имеет большее значение в строке str1, чем в строке str2; А значение меньше нуля свидетельствует об обратном.

Или иначе сказано cppreference.com:

Возвращаемое значение

  • Отрицательное значение, если левая меньше правой.
  • 0, если левая равна правой.
  • Положительное значение, если левая больше правой.

Итак, в вашем коде strcmp(t->detectColor->name, "ghghjg") вернет нечто отличное от 0. Как следствие, будет напечатано «XXXXXXXXXXX».

Вам нужно только изменить:

if (std::strcmp(t->detectColor->name, "ghghjg") != 0)

to

if (std::strcmp(t->detectColor->name, "ghghjg") == 0)

И то же самое для другого сравнения.

person Maxime Chéramy    schedule 14.11.2013
comment
использовать лучший cppreference для цитат - person 4pie0; 14.11.2013
comment
@piotruś: Вы говорите, что эта цитата неверна? Мне кажется, это нормально, хотя, возможно, было бы лучше цитировать стандарт C, а не какой-то веб-сайт. - person Mike Seymour; 14.11.2013
comment
@piotruś Я добавил вашу ссылку. Я использовал cplusplus.com, потому что они часто являются первым результатом в Google и выполняют свою работу. - person Maxime Chéramy; 14.11.2013
comment
Я просто хотел дать совет, cppreference - лучший источник, в этом случае, однако, цитата, конечно, верна. - person 4pie0; 14.11.2013
comment
Спасибо, чувак, разве сравнение не было таким продвинутым в С++ :) - person clankill3r; 14.11.2013
comment
@ clankill3r: в C++ вы бы использовали std::string и сравнили с ==. Это сложно только потому, что вы по какой-то причине используете библиотеку C. - person Mike Seymour; 14.11.2013
comment
@Mike Seymour, как насчет сравнения const char * со строкой? Также ==? (сейчас не могу проверить, но интересно) - person clankill3r; 15.11.2013
comment
@ clankill3r: Да, вы также можете сравнить std::string со строкой const char* в стиле C, используя ==. - person Mike Seymour; 15.11.2013

std::strcmp возвращает 0, если строки совпадают, и значение меньше 0 или больше 0, если строки различаются. Таким образом, вы можете изменить свой код на что-то вроде этого:

if (std::strcmp(t->className, "IM_SURE_IT_CANT_BE_THIS") != 0) {
  printf("indeed, strings are different\n");

Отрицательное значение, если левая меньше правой. ​0​, если левая равна правой. Положительное значение, если левая больше правой.

http://en.cppreference.com/w/cpp/string/byte/strcmp


Как я могу получить действительное сравнение?

if (std::strcmp(t->className, "IM_SURE_IT_CANT_BE_THIS") == 0) {
      printf("strings are equal lexicographically\n");
person 4pie0    schedule 14.11.2013