代码如何在C中返回字符数组?

问题描述 投票:0回答:2

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

#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
2个回答
1
投票

在您的代码int function()中,此函数的返回值为int,但您想获取字符串,因此请使用char * function()

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

您的代码示例:

#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;
}

0
投票

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

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

T

它被解释为

return word;  

由于return &word[0]; // return char * 对于函数而言是本地的,所以当word退出时它不再存在,所以您最终返回了一个invalid指针。

有三种解决方法:

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; }

因此涵盖了功能方面,让我们着眼于调用方。

对于数组声明,唯一有效的initializers是用括号括起来的值序列:

scanf

或者,对于字符数组,用引号引起来的字符串:

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

您无法使用函数的结果在声明中初始化数组,因为函数无法返回数组类型。

[要将一个数组的内容复制到另一个数组,您需要使用 char word[100] = "Hello"; (对于字符串,即以strcpy结尾的char数组)或0(对于所有其他数组类型),并且您不能在声明中这样做。

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

scanf
© www.soinside.com 2019 - 2024. All rights reserved.