因此,主要问题是函数无法返回数组类型,并且您无法使用= 运算符将一个数组的内容复制到另一个数组。 C 中的数组不同于其他类型。
除非它是sizeof 或一元& 运算符的操作数,或用于在声明中初始化字符数组的字符串文字,否则为“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
}