Результат сравнения строк
У меня есть следующий код:
char a[5] = "bang";
char b[5] = "";
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
if (a != b){
for(int i=0; i<4; i++){
b[i] = a[i];
}
Serial.print("b: ");
Serial.println(b);
Serial.println("Not Equal");
delay(1000);
}
else{
delay(1000);
}
}
Почему получается:
b: bang
Not Equal
b: bang
Not Equal
b: bang
Not Equal
Разве a
и b
не должны быть равными после первого цикла?
@opu 웃, 👍0
Обсуждение2 ответа
Как уже упоминал Матей, используйте:
strcmp(a, b) != 0
Если вы сравниваете a и b, на самом деле вы сравниваете два указателя (на текстовые символы). Эти указатели a и b хранятся в разных местах памяти, хотя само содержимое может быть одинаковым.
Смотрите на это так:
a memory location 0x12345: "Bang"
b memory location 0x1234A: "Bang" (5 memory locations further)
Две ошибки. @michel-keijzers уже прокомментировал один из них по поводу strcmp() для сравнения со строками в разных позициях памяти.
Еще одна ошибка: строки C оканчиваются нулем, поэтому вам необходимо также скопировать пятый символ или , как и в вашем коде, длина строки не определяется:
for(int i = 0; i < 5; i++) {
b[i] = a[i];
}
... или лучше, используйте strcpy():
strcpy(b, a);
strncpy не был предназначен для этого, он имел конкретное применение в прошлом (давно-давно), см., например: https://stackoverflow.com/questions/6987217/strncpy-or-strlcpy-in-my-case чем раньше вы забудете о strncpy, тем лучше., @Jot
Что ж, ИМХО, использование strncpy — лучшая практика, позволяющая избежать переопределения памяти. В любом случае, я редактирую ответ с помощью strcpy, чтобы избежать параллельного обсуждения., @caligari
- Очень простая операция Arduino Uno Serial.readString()
- Как преобразовать строку в массив байтов
- Как отправить строку с подчиненного устройства Arduino с помощью SPI?
- Понимание того, почему следует избегать «String» и альтернативных решений
- Arduino: как записать значение переменной в текстовый файл и изменить его на SD-карте?
- Буфер char в String в Arduino UNO
- Сохранить начальный ноль HEX в строку RFID RC522 Arduino
- Разделение Serial.readString на массив строк
Попробуйте
if(strcmp(a, b) != 0)
вместоif (a != b)
, @Matej