Как сравнить строки массива?

Regloger
Offline
Зарегистрирован: 01.06.2018

Уважаемые знакомки подскажите, как сравнить строки массива?

Т.е. есть массивы:

1) byte addr[8];

2) byte addr1[8][8];

Нужно написать условие, по которому  полностью сравнивается строка массива addr со строкой addr1 и при отсутствии совпадения она бы записывалась в массив addr1. И так 8 раз. Есть совпадения ничего не пишем, есть уникальная строка, записываем… как  это реализовать? Заранее спасибо!

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

см. memcmp.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Regloger пишет:

Нужно написать условие,

Если нужно, - напишите.

Если там у Вас именно стрки (оканчивающиеся '\0'), то используйте функцию strcpm, а если произвольные куски памяти, то memcmp.

А когда напишете, если вдруг что-то не так, публикойте код и задавайте вопросы.

Regloger
Offline
Зарегистрирован: 01.06.2018

Смог сделать только так: 

#include <OneWire.h>
int pin = 10; 
 
OneWire ds(pin);
byte addr[8]; 
byte addr1[8][8];
 
void setup() {
Serial.begin(9600);}
 
void loop() {
if (ds.search(addr)){
 
if ( addr[0] != addr1[0][0] && //ПОЧЕМУ НЕ РАБОТАЕТ ЭТО УСЛОВИЕ?
     addr[1] != addr1[0][1] &&
     addr[2] != addr1[0][2] &&
     addr[3] != addr1[0][3] &&
     addr[4] != addr1[0][4] &&
     addr[5] != addr1[0][5] &&
     addr[6] != addr1[0][6] &&
     addr[7] != addr1[0][7])
{
int p=0;
while (p<8) {
addr1[0][p] = addr[p];
p++;        }
}
 
else    {
  Serial.println("False");
        }
 

Но при этом, почему-то, не отрабатывает условие... Т.е. изначально массив addr содержит данные и при сравнении с пустым массивом addr1 они должны быть не равны... И далее addr1 должен скопировать в себя значения addr. Но почему то в итоге выводится строчка "False". Т.е. массивы вроде как одинаковые. Но это не так. Где я ошибся в условии?

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

1.  Вставка программного кода в тему/комментарий(если не хотите получать ответы типа "у Вас ошибка в строке № ХЗ)

2. А что, наши советы про strcmp и memcmp прошли мимо?

Regloger
Offline
Зарегистрирован: 01.06.2018
#include <OneWire.h>
int pin = 10; 

OneWire ds(pin);
byte addr[8]; 
byte addr1[8][8];

void setup() {
Serial.begin(9600);}

void loop() {
if (ds.search(addr)){

if ( addr[0] != addr1[0][0] && //ПОЧЕМУ НЕ РАБОТАЕТ ЭТО УСЛОВИЕ?
     addr[1] != addr1[0][1] &&
     addr[2] != addr1[0][2] &&
     addr[3] != addr1[0][3] &&
     addr[4] != addr1[0][4] &&
     addr[5] != addr1[0][5] &&
     addr[6] != addr1[0][6] &&
     addr[7] != addr1[0][7])
{
int p=0;
while (p<8) {
addr1[0][p] = addr[p];
p++;        }
}

else    {
  Serial.println("False");
        }
ds.reset_search();}} 

 

Regloger
Offline
Зарегистрирован: 01.06.2018

ЕвгенийП пишет:

 

2. А что, наши советы про strcmp и memcmp прошли мимо?

 

С реализацией пока не могу разобраться... 

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Regloger пишет:

ЕвгенийП пишет:

 

2. А что, наши советы про strcmp и memcmp прошли мимо?

 

С реализацией пока не могу разобраться... 

 

Не, тебя в гугле забанили. И не только в гугле, а, по ходу, вообще везде. Ты не в чебурнете сидишь случаем? Вот тебе ссылка, пользуйся: https://www.google.ru/search?newwindow=1&rlz=1C1GGRV_enRU753RU753&ei=fsoSW8DQJcjawQKT9q-ACg&q=memcmp+%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80&oq=memcmp+%D0%BF%D1%80&gs_l=psy-ab.3.0.33i160k1l2.28843.29562.0.30953.3.3.0.0.0.0.183.359.0j2.2.0....0...1c.1.64.psy-ab..1.2.357...0j0i203k1.0.g3qJhc1Qfg0

Пока я вижу, что ты хочешь, чтобы написали ЗА ТЕБЯ. Сравнить два блока памяти - не бином Ньютона, разберёшься ;)

Regloger
Offline
Зарегистрирован: 01.06.2018

DIYMan большое спасибо!