Я студент университета. и учитель хочет, чтобы я передал несколько строк для работы. Вывод ответа правильный, но мне интересно, почему это предупреждение отображается и как это исправить в моем случае.
Я пытаюсь понять это, но так много раз я ищу. Он просто содержит другой случай, и никто не похож на мой случай (используя жало с указателем). Поэтому, если вы можете дополнительно порекомендовать мне веб-сайт, на котором есть мой случай или что-то с передачей 2d-массива для работы, я буду очень признателен.
Вот код
#include <stdio.h>
#include <string.h>
int hydroxide(char (*message)[100], int size);
int main()
{
char message[6][100] = {"KOH", "H2O2", "NaCl", "NaOH", "C9H8O4", "MgOH"};
int size;
printf("Messages ending with OH are: ");
for(int i = 0; i < 6; i++)
{
size = strlen(message[i]);
if (hydroxide(message[i], size) == 1)
{
printf("%s ", message[i]);
}
}
printf("\n");
return 1;
}
int hydroxide(char (*message)[100], int size)
{
if (((*message)[size - 2] == 'O') && ((*message)[size - 1] == 'H'))
{
return 1;
}
else
{
return 0;
}
}
Когда я пытаюсь запустить его, это выглядит так.
HW-4_5_3.c: In function 'main':
HW-4_5_3.c:19:22: warning: passing argument 1 of 'hydroxide' from incompatible pointer type [-Wincompatible-pointer-types]
if (hydroxide(message[i], size) == 1)
^~~~~~~
HW-4_5_3.c:6:5: note: expected 'char (*)[100]' but argument is of type 'char *'
int hydroxide(char (*message)[100], int size);
^~~~~~~~~
Messages ending with OH are: KOH NaOH MgOH
Мне нужна та часть, что «Сообщения, заканчивающиеся на OH: KOH NaOH MgOH». Итак, как я могу это исправить?
Если у вас есть
int hydroxide(char (*message)[100], int size);
вам нужно указать указатель на char[100]
:
if (hydroxide(&message[i], size) == 1)
// ^
Если вы действительно хотите, чтобы исходный вызов работал, вам нужно изменить hydroxide
. Пример:
int hydroxide(char *message, int size)
{
if (size < 2) return 0; // added precaution
if ((message[size - 2] == 'O') && (message[size - 1] == 'H'))
{
return 1;
}
else
{
return 0;
}
}
Первый параметр функции
int hydroxide(char (*message)[100], int size);
имеет тип char ( * )[100]
, но в вызове функции
if (hydroxide(message[i], size) == 1)
соответствующий аргумент имеет тип char *
. То есть массив message[i]
, имеющий тип char[100]
, используемый в качестве выражения аргумента, неявно преобразуется в указатель типа char *
на его первый элемент.
Объявите и определите функцию следующим образом
int hydroxide( const char *message )
{
size_t n = strlen( message );
return n > 1 && message[n-2] == 'O' && message[n-1] == 'H';
}
и назовите это как
if ( hydroxide(message[i] ) )
Обратите внимание, что у функции должен быть один параметр: указатель на строку. Параметр должен иметь квалификатор const
, потому что функция не изменяет переданную строку. Второй параметр сбивает с толку только потому, что предполагается, что функция имеет дело со строками. Так что он сам должен определить длину строки и проверить, не меньше ли она 2
.
Нет необходимости использовать два оператора return в операторе if-else внутри функции. Достаточно написать один оператор return с выражением, содержащим логические операторы. В этом случае функция вернет ровно либо 1
, либо 0
.
@LunaticCoder char *message объявляет указатель на символ. Это указатель на первый символ строки message[i], переданной функции в качестве выражения аргумента.
Таким образом, нет необходимости объявлять 2d-массив как параметр char. Правильно ли я понял?
@LunaticCoder Функция работает со строками. Строки хранятся в виде одномерных массивов.
Вы объявляете параметр, который представляет собой массив указателей char размером 100. Попробуйте изменить его на указатель
int hydroxide(char *message, int size);
Вам не нужно объявлять размер строк с нулевым завершением в качестве параметра
Спасибо. А также я хочу знать, знает ли компилятор, что char *message является массивом 2d? или это известно из-за типа char? Сначала я подумал, что он не знает, что я объявляю параметр 2d, и решил использовать (*message)[100].