#c #function-pointers #c-strings #strlen #function-declaration
#c #функции-указатели #c-строки #strlen #объявление функции
Вопрос:
Основная проблема заключается в следующем: как только я отправляю строку из одной функции в другую, эта вторая функция на самом деле не получает строку в качестве параметра.
Подробнее: у меня есть функция void myfunc()
, содержащая слово. Это слово должно быть отправлено другой функции, чтобы она могла подсчитать его длину. Это то, что я написал до сих пор:
void myfunc(int (*countlength)(char ch)){
char word[10] = "Hellon";
int result = countlength(amp;word);
printf("Length of word: %dn", result);
}
Слово отправляется в эту функцию countlength(char* word)
:
int countlength(char* word) {
int length = strlen(word);
return length;
}
Однако функция countlength()
не может подсчитать ее длину, и я не знаю почему…
Дело в том, что это работает, когда слово находится в основной функции. Кто-нибудь знает, почему мой код не работает?
Комментарии:
1. Либо измените
countlength(amp;word)
наcountlength(amp;word[0])
илиcountlength(word)
2.
int (*countlength)(char)
является указателем на функцию, которая принимает achar
. Вы имеете в виду писатьint (*countlength)(char*)
?3. почему функция myfunc
int (*countlength)(char ch)
используется в качестве параметра?
Ответ №1:
Две ошибки:
void myfunc(int (*countlength)(char ch)){
должно быть
void myfunc(int (*countlength)(char* ch)){
вместо этого, поскольку функция принимает указатели символов.
Во-вторых,
int result = countlength(amp;word);
должно быть
int result = countlength(word);
как word
уже есть char*
.
Ответ №2:
То, что вы передаете функции, не соответствует тому, что она ожидает.
amp;word
имеет тип char (*)[10]
, то есть указатель на массив размером 10. Функция ожидает a char *
, поэтому просто передайте word
. Массивы преобразуются в указатель на их первый элемент при передаче функции, поэтому типы будут совпадать.
Ответ №3:
Это объявление параметра указателя на функцию
int (*countlength)(char ch)
не соответствует объявлению функции, используемой в качестве аргумента для этого параметра
int countlength(char* word)
Итак, вам нужно объявить параметр как
int (*countlength)(char *ch)
На самом деле идентификатор ch является избыточным. Вы могли бы просто написать
int (*countlength)(char *)
То есть объявление функции myfunc будет выглядеть следующим образом
void myfunc(int (*countlength)(char *));
Вы объявили массив символов внутри функции, например
char word[10] = "Hellon";
Итак, выражение, используемое в качестве аргумента в этом вызове
countlength(amp;word)
имеет тип char ( * )[10]
вместо ожидаемого типа char *
.
Нет необходимости использовать адрес оператора. Обозначение массива, используемое в качестве аргумента в этом вызове
countlength( word )
неявно преобразуется в указатель на первый элемент массива и имеет тип char *
.
Эта функция
int countlength(char* word) {
int length = strlen(word);
return length;
}
не изменяет свой аргумент. Поэтому она должна быть объявлена как минимум как
int countlength( const char* word) {
int length = strlen(word);
return length;
}
Используемая стандартная строковая функция C strlen
имеет возвращаемый тип size_t
. В общем случае объект типа int
может быть недостаточно большим для хранения возможных длин строк.
Таким образом, функция должна быть объявлена как
size_t countlength( const char* word) {
return strlen(word);
}
Таким образом, возвращаясь к функции myfunc
, она должна выглядеть так
void myfunc( size_t ( *countlength )( const char * ) )
{
char word[10] = "Hellon";
size_t result = countlength( word );
printf( "Length of word: %zun", result );
}
Ответ №4:
Что ж; если вы используете такой код, он работает просто отлично, когда вы объявляете массив, его имя имеет тип указателя, поэтому здесь word имеет тип char * и это указатель на первый элемент массива
#include <stdio.h>
#include <string.h>
int countlength(char* word) {
int length = strlen(word);
return length;
}
void myfunc(){
char word[10] = "Hellon";
int result = countlength(word);
printf("Length of word: %dn", result);
}
main(){
myfunc();
}
Длина слова: 6