【问题标题】:How can code return an array of characters in C?代码如何在 C 中返回一个字符数组?
【发布时间】:2020-07-24 11:44:22
【问题描述】:

我无法完成此操作。我实际上想创建一个从 scanf 命令返回简单单词的函数,以将其调用到主代码中。我知道函数不能正确返回数组,但是我看过很多教程,但还不明白。用于大学目的。

#include <stdio.h>
#include <cstring>

int function() {
  char word[100];
  scanf("%s", &word);
  return word;
}

int main() {
  char word2[100] = function();
}

【问题讨论】:

    标签: c arrays function return function-call


    【解决方案1】:

    因此,主要问题是函数无法返回数组类型,并且您无法使用= 运算符将一个数组的内容复制到另一个数组。 C 中的数组不同于其他类型。

    除非它是sizeof 或一元&amp; 运算符的操作数,或用于在声明中初始化字符数组的字符串文字,否则为“N 元素”类型的表达式 T”的数组被转换(“衰减”)为“指向T”的指针类型的表达式,表达式的是第一个元素的地址。所以当你写

    return word;  
    

    它被解释为

    return &word[0];  // return char *
    

    由于word 是本地函数,当function 退出时,它不再存在,因此您最终会返回一个无效 指针。

    有三种方法可以解决这个问题:

    word 声明为static

    char *function( void )
    {
      static char word[100];
    
      scanf( "%s", word ); // no & operator here
      return word; // return char *
    }
    

    将数组声明为static 意味着它存在于程序的整个生命周期中,而不仅仅是该函数。这可行,但它限制了函数的实用性,不推荐使用。

    动态分配数组:

    char *function( void )
    {
      char *word = malloc( sizeof *word * 100 );
    
      scanf( "%s", word ); // again, no & operator
      return word;
    }
    

    这比创建数组static 更好,但现在你必须确保在完成后free 数组。

    将目标数组作为参数传递给函数:

    void function( char *word, size_t size )
    {
      scanf( "%s", word );
      return word;
    }
    

    这是我的首选方法,但在这种特殊情况下,您不妨直接致电scanf

    这样就涵盖了函数方面,让我们来处理调用方。

    数组声明唯一有效的初始化器是大括号括起来的值序列:

     char word[100] = {'H', 'e', 'l', 'l', 'o', 0 };
    

    或者,在字符数组的情况下,一个带引号的字符串:

     char word[100] = "Hello";
    

    你不能用函数的结果在声明中初始化数组,因为函数不能返回数组类型。

    要将一个数组的内容复制到另一个数组,您需要使用strcpy(对于字符串,它是char 和终止0 的数组)或memcpy(对于所有其他数组类型) ,你不能在声明中这样做。

    如果您只需将一个单词读入数组,只需绕过function,直接调用scanf

    int main( void )
    {
      char word[100];
    
      scanf( “%s”, word );
      // do stuff with word
    }
    

    【讨论】:

      【解决方案2】:

      在你的代码int function()中,这个函数的返回值是int,但是你想获取字符串,所以改用char * function()

      并且,scanf("%s",&amp;word); 请勿将&amp; 用于字符数组。

      您的代码示例:

      #include <stdio.h>
      #include <string.h>
      #include <stdlib.h>
      
      char * function () {
          char * word = malloc(sizeof(64));
          if (!word)
             return NULL;
          scanf("%s",word);
          return word;
      }
      int main () {
          char * word2 = function();
          printf("%s\n", word2);
          free(word2);
          return 0;
      }
      

      【讨论】:

      • 你需要记住释放你的内存以防止内存泄漏和内存不足
      • 考虑避免scanf("%s",word);,因为它就像gets()。建议scanf("%63s",word);
      猜你喜欢
      • 2011-11-29
      • 2014-12-18
      • 2011-12-30
      • 2023-03-12
      • 1970-01-01
      • 2021-03-08
      • 2012-12-03
      • 1970-01-01
      • 2014-11-22
      相关资源
      最近更新 更多