Сравните две строки, как в strcmp ошибка ошибка: недопустимый аргумент типа унарного ‘*’ (есть ‘int’)

#c #pointers #comparison #c-strings

Вопрос:

Я пытаюсь написать функцию C, которая сравнивает строки не как равенство указателей, а как равенство содержимого. Но я получаю ошибку

ошибка: недопустимый аргумент типа унарного ‘*’ (имеет ‘int’)

Это мой код:

 #include lt;stdio.hgt; #include lt;stdlib.hgt;  int stringcompare(char * str1, char * str2, int strSize){  char * word1 = str1;  char * word2 = str2;    for (int i = 0; i lt; strSize; i  ) {  if (*word1[i] != *word2[i]) {  printf("The strings are DIFFERENT!");  return 1;  }  }  printf("The strings are a MATCH!");  return 0; }  int main(void){  char * str1 = "Hello World!";  char * str2 = "Hello World!";  stringcompare(str1, str2, 13); }   

Комментарии:

1. Что вы понимаете *word1[i] под этим?

2. word1[i] является целочисленным значением (элементом массива), поэтому его нельзя разыменовать *word1[i] .

Ответ №1:

Для массива, на который указывает by *ptr , элемент в позиции i разыменован *(ptr i) , что эквивалентно ptr[i] и нет *ptr[i] .

Ответ №2:

Это утверждение if

 if (*word1[i] != *word2[i]) {  

неверно, потому что выражения word1[i] и word2[i] имеют тип char . Таким образом, вы не можете применять оператор разыменования для объекта данного типа char .

Вы должны написать, например

 if ( word1[i] != word2[i]) {  

Обратите внимание, что стандартная строковая функция strcmp имеет только два параметра и возвращает либо отрицательное значение, либо ноль, либо положительное значение в зависимости от того, больше ли первая строка второй строки или равна второй строке или меньше второй строки.

Похоже, вы имеете в виду другую стандартную строковую функцию strncmp , которая действительно имеет три параметра..

Также вам нужно проверить, встречался ли уже нулевой завершающий символ.

Кроме того, параметры функции должны иметь квалификатор const , поскольку передаваемые строки не изменяются внутри функции.

Функция может быть объявлена и определена следующим образом

 int stringcompare( const char *s1, const char *s2, size_t n ) {  while ( n amp;amp; *s1 amp;amp; *s1 == *s2 )  {    s1;    s2;  --n;  }   return n == 0 ? 0 : *s1 - *s2; }