#1 Re: Програмування Arduino » Сравнение двух массивов char » 2014-12-02 12:01:51

motin.maxim пише:

Но вродебы такого произойти не может, сравниваются два одинаковых по размеру массива. Если такое написать допустим просто на С, думаю будет работать.

Это утверждение неверно, т.к. на C массив это указатель на его первый элемент, если он задан статически (как в этом примере), то его размер знает компилятор на момент сборки, поэтому можно использовать sizeof(n_tel)/sizeof(char). Но компилятор не будет проверять выход за границы массива. Т.е. если строки будут одинаковые - программа пойдет дальше проверять байты (на настольном ПК скорее всего закончится segmentation fault - т.е. попытка прочитать память, которая нам не принадлежит).
И, кстати это все-равно плохой пример, т.к. в 99% случаев сравнивать (в реальной программе) придется динамические строки, о размере которых не знает даже компилятор.
C-строки характеризуются как раз тем, любую строку завершает символ '\0' (числовое значение - 0x00). поэтому функцию сравнения можно организовать следующим образом:

int strcheck(char *str1, char *str2){
  int i = 0;
  while(str1[i] != '\0' && str2[i] != '\0'){
    if(str1[i] != str2[i])
      return 0;
    i++;
  }
  //Если мы вышли из цикла значит одну из строк мы перебрали до конца
  if(str1[i] == '\0' && str2[i] == '\0')
    return 1;
  return 0;
}

Функция вернет 1 если строки одинаковые, или 0 - если он отличаются (как по содержимому, так и по длине).
На лаконичность/красоту кода не претендую, хотел только показать как можно работать со строками не зная (заранее) их длину.

Підвал форуму