【问题标题】:C Code: Pass string from one function to another functionC 代码:将字符串从一个函数传递到另一个函数
【发布时间】:2021-02-03 22:35:17
【问题描述】:

主要问题是:一旦我将字符串从一个函数发送到另一个函数,第二个函数并没有真正将字符串作为参数。

详细说明: 我有一个函数void myfunc() 包含一个单词。这个词应该被发送到另一个函数,所以它可以计算它的长度。这就是我到目前为止所写的:

void myfunc(int (*countlength)(char ch)){

    char word[10] = "Hello\n";

    int result = countlength(&word);

    printf("Length of word: %d\n", result);
}

单词正在发送到这个函数countlength(char* word)

int countlength(char* word) {
    int length = strlen(word);
    return length;
}

但是函数countlength() 无法计算它的长度,我不知道为什么......

问题是,当单词在 main 函数中时它会起作用。有人知道为什么我的代码不起作用吗?

【问题讨论】:

  • countlength(&word) 更改为countlength(&word[0])countlength(word)
  • int (*countlength)(char) 是一个指向接受char 的函数的指针。你的意思是写int (*countlength)(char*)
  • 为什么函数 myfunc 有 int (*countlength)(char ch) 作为参数?

标签: c function-pointers c-strings strlen function-declaration


【解决方案1】:

两个错误:

void myfunc(int (*countlength)(char ch)){

应该是

void myfunc(int (*countlength)(char* ch)){

相反,因为函数接受 char 指针。

其次,

int result = countlength(&word);

应该是

int result = countlength(word);

因为word 已经是char*

【讨论】:

    【解决方案2】:

    您传递给函数的内容与预期的不符。

    &word 的类型为 char (*)[10],即指向大小为 10 的数组的指针。该函数需要 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] = "Hello\n";
      

      所以在此调用中用作参数的表达式

      countlength(&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] = "Hello\n";
      
          size_t result = countlength( word );
      
          printf( "Length of word: %zu\n", 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] = "Hello\n";
            int result = countlength(word);
            printf("Length of word: %d\n", result);
        }
        main(){
            myfunc();
        }
        

        字长:6

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-02-13
          • 1970-01-01
          • 1970-01-01
          • 2021-12-12
          • 2022-01-13
          • 1970-01-01
          相关资源
          最近更新 更多