Результат сравнения строк

У меня есть следующий код:

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 не должны быть равными после первого цикла?

, 👍0

Обсуждение

Попробуйте if(strcmp(a, b) != 0) вместо if (a != b), @Matej


2 ответа


1

Как уже упоминал Матей, используйте:

strcmp(a, b) != 0

Если вы сравниваете a и b, на самом деле вы сравниваете два указателя (на текстовые символы). Эти указатели a и b хранятся в разных местах памяти, хотя само содержимое может быть одинаковым.

Смотрите на это так:

a   memory location 0x12345: "Bang"
b   memory location 0x1234A: "Bang"    (5 memory locations further)
,

1

Две ошибки. @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