Сравнение int8_t и char * с использованием strcmp / strncmp - PullRequest
0 голосов
/ 30 января 2019

В настоящее время пытаюсь исправить код, который какое-то время оставался неиспользованным.

У меня есть две переменные: int8_t foo[size] и const char* const bar.

Существует if, который проверяет if(0 != strcmp((char *)foo, bar))

В настоящее время это не удается, даже если printf("%s | %s", foo, bar) возвращает две одинаковые строки.Я также попытался strncmp, что также не удается.

Из исследований в Интернете я понимаю, что это, скорее всего, связано с завершением нулевых байтов, однако я не понимаю, как бы я решил / обойти это.

int8_t foo[size];
const char* const bar;

if(0 != strcmp((char *)foo, bar)){
   fail 
}

Ожидаемые результаты strcmp возвращает 0, потому что обе строки одинаковы при печати.

Фактический результат: возврат не выполнен.

Фактические данные: 5352A565712345657567565785658956581
При работе printf("Value of foo and bar: %s and %s", foo, bar) обе переменные возвращают эти данные выше.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Я не могу воссоздать этот сценарий, несмотря на получение предупреждений во время компиляции.Какое поведение ожидается?Вы имеете в виду, что сравнение не удалось или код не может попасть в блок if?Если оба массива содержат одинаковые данные, strcmp() вернет 0, а затем блок if не будет выполнен.

Я просто пытаюсь уточнить.Ответ Бруно, учитывая поведение strcmp, также верен.

0 голосов
/ 30 января 2019

недостаточно иметь:

int8_t foo[] = { 'a', 'b' };

, чтобы иметь возможность

if (strcmp(foo, "ab") == 0)
  puts("equals");
else
  puts("not equal");

, потому что strcmp , как и многие другие функции, работающие на char * ожидается нулевой символ, обозначающий конец строки.

Что добавляется, когда strcmp идет после 'b' в foo , это неопределенное значениеповедение

поэтому

int8_t foo[] = { 'a', 'b', 0 };

является кандидатом на strcmp(foo, "ab") благодаря добавленному нулевому символу, позволяющему strcmp не выходить из foo в любом случае


Обратите внимание, что такая же проблема возникает, если вы делаете printf("%s", foo); в первом случае, когда нулевой символ не достигается в памяти после 'b' из foo функция printf попытается записать память в виде символов, но это неопределенное поведение

...