Сравнение массивов символов в Си
У меня есть следующая функция для сравнения двух массивов символов в 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, так как "СЛОВО" автоматически обнулится.