我正在学习基本的C编程课程,我正在尝试创建一个刽子手游戏。在过去的三个小时里,我一直被一个问题困扰着,我一点也不知道。
基本上,我已经创建了一个函数,它从文本文件中读取随机行,然后将其复制到字符串中。之后,我想将该字符串复制到函数外的另一个字符串中。这是因为主游戏应该是完全用功能构建的。
这是一个从文本文件中读取随机单词并将其复制到字符串中的函数:
char datorns_val()
{
char ordlista[20];
char valt_ord[20];
int raknare = 0;
srand(time(NULL));
random = rand()%10+0;
ptr_file =fopen("hangman.txt","r");
if (!ptr_file)
{
return 1;
}
while (fgets(ordlista,20, ptr_file)!=NULL)
{
raknare++;
if (raknare == random)
strcpy(valt_ord, ordlista);
}
return valt_ord;
}
完成后,我想将valt_ord中的单词复制到另一个字符串中,这时我不确定该怎么做:
char word[20];
strcpy(word,datorns_val());
我收到两个错误,上面写着:
Invalid conversion from 'char' to 'const char*'
和
initializing argument 2 of 'char* strcpy(char*, const char*)'
我两次使用strcpy()
是在正确的轨道上,还是完全迷失了方向?我尝试了在没有函数结构的情况下构建,只需一个接一个地键入所有代码,如果用一个简单的char word = valt_ord.
替换第二个strcpy()
,它就可以了
谢谢,Jonathan
(很抱歉,如果我的代码很难理解,我是瑞典人,我的第二语言是英语)
当前您正在返回一个字符,这没有多大用处,因为您需要一个比创建它的函数寿命更长的字符串。您应该为此返回一个动态分配的字符串(使用指针)。
char* datorns_val()
{
// ... your current code
char *ret_str = malloc(20);
strcpy(ret_str, valt_ord);
return ret_str;
}
在你使用它的最后,你应该在完成后释放它。
char *result = datorns_val();
// use result
free(result);
result = NULL;
或者,如果你确定调用datorns_val
的函数是唯一一个将使用结果的函数,那么我建议使用其他不涉及动态内存分配/贴花的函数(malloc
/free
)。将要加载的字符串传递给datorns_val
。
int datorns_val(char (*str_ptr)[20]) // pointer to an array of 20 chars
{
// use str_ptr after dereferencing it to get back the char array
// say you want to copy "abc" to it
strcpy(*str_ptr, "abc");
return 0; // to denote success, you may return -1 for failure
}
// caller's end
char result[20] = "";
int success = datorns_val(&result); // pass the array by reference
阅读更多关于数组和指针的信息,了解更多关于它们的信息。
datorns_val
被声明为返回char
,而实际上它返回类型为char[]
的valt_ord
。还有一个更大的问题,valt_ord
是一个局部变量,所以即使您更改声明,代码也无法工作。您需要动态分配valt_ord
(使用malloc
)或将其作为函数参数传递。
strcpy
的参数2需要字符串,但函数返回char。
man strcpy。
如果您试图返回局部变量,当您移出函数时,它将被销毁,因为它将数据存储在stack
中。使用malloc
有关的进一步澄清,请参阅此SO问题