将函数中的单词复制到C中带有strcpy的字符串中



我正在学习基本的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问题

最新更新