#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; }