2013-11-14 3 views
1

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

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? 

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

+2

RTFM. Шутки в сторону. –

+0

Вы хорошо спали? Исходя из этого сообщения: http://stackoverflow.com/questions/2931704/how-to-compare-string-with-const-char Это довольно простая ошибка. – clankill3r

ответ

7

В соответствии с cplusplus.com:

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

Или говорит по-разному cppreference.com:

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

  • Отрицательное значение, если LHS меньше ОРЗ.
  • 0 если lhs равно rhs.
  • Положительное значение, если lhs больше, чем rhs.

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

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

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

в

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

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

+0

использовать лучше cppreference для цитат – 4pie0

+0

@ piotruś: Вы говорите, что эта цитата неверна? Это выглядит хорошо для меня, хотя, возможно, было бы лучше процитировать стандарт C, а не какой-то веб-сайт. –

+0

@ piotruś Я добавил вашу ссылку. Я использовал cplusplus.com, потому что они часто являются первым результатом в Google и выполняют эту работу. –

0

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

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

Отрицательное значение, если LHS меньше ОРЗ. 0 если lhs равно rhs. Положительное значение, если lhs больше, чем rhs.

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"); 
Смежные вопросы