Код C: передача строки из одной функции в другую функцию

#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) является указателем на функцию, которая принимает a char . Вы имеете в виду писать 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