我很难完成此操作。我实际上是想创建一个从scanf命令返回一个简单单词的函数,以将其调用到主代码中。我知道函数不能正确返回数组,但是II已经看了很多教程,但还不了解。用于大学目的。
#include <stdio.h>
#include <cstring>
int function() {
char word[100];
scanf("%s", &word);
return word;
}
int main() {
char word2[100] = function();
}
在您的代码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;
}
因此,主要问题是函数无法返回数组类型,并且无法使用=
运算符将一个数组的内容复制到另一个数组。 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