Сравнение массивов символов в Си

У меня есть следующая функция для сравнения двух массивов символов в C:

short test(char buffer[], char word[], int length) {
    int i;
    for(i = 0; i < length; i++) {
        if(buffer[i] != word[i]) {
            return 0;
        }
    }
    return 1;
}

И где-то в основном:

char buffer[5]; //which is filled correctly later
...
test(buffer, "WORD", 5);

Он немедленно возвращает 0 при i = 0. Если я изменю функцию на эту:

short test(char buffer[], int length) {
    int i;
    char word[5] = "WORD";
    for(i = 0; i < length; i++) {
        if(buffer[i] != word[i]) {
            return 0;
        }
    }
    return 1;
}

... Отлично работает. В первой версии функции test debugger говорится, что буфер и массивы слов имеют тип char*. Во второй версии функции test говорится, что буфер является типом char *, а тестовый массив - типом char[]. Функция strcmp() тоже не работает.

Что на самом деле здесь не так? Программа сделана для микроконтроллера PIC, компилятор C18 и IDE MPLAB.

1 ответ

Решение

Хм...

Иногда во встроенных системах есть различие в том, где хранятся строки.

В первом примере вы определяете строку, которая хранится только в области флеш-кода. Поэтому сравнение с индексом 0 не удастся из-за разницы в области памяти.

Во втором примере вы определяете локальную переменную, которая содержит ту же строку. Это будет находиться в оперативной памяти, поэтому сравнение работает, так как они оба в оперативной памяти.

Я бы протестировал следующее:

char buffer[5]; //which is filled correctly later
char word[5] = "WORD";
...
test(buffer, word, 5);

Скорее всего, это сработает, потому что сравнение выполняется в ОЗУ полностью.

Да и удалите \0, так как "СЛОВО" автоматически обнулится.

Другие вопросы по тегам