【问题标题】:Copy a word from a function to a string with strcpy in C?在C中使用strcpy将一个单词从一个函数复制到一个字符串?
【发布时间】:2014-01-23 15:05:33
【问题描述】:

我正在学习基本的 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(),它就可以工作了

谢谢,乔纳森

(对不起,如果我的代码难以理解,我是瑞典语,我的第二语言是英语)

【问题讨论】:

  • 您正在返回一个在堆栈上的 char 数组,所以这不起作用。您需要在堆上返回它的副本,并使用malloc 分配。

标签: c string strcpy


【解决方案1】:

目前您正在返回一个没有多大用处的字符,因为您需要一个比创建它的函数寿命更长的字符串。您应该为此返回一个动态分配的字符串(使用指针)。

 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

阅读更多关于arrays and pointers 的信息以了解更多信息。

【讨论】:

  • 谢谢传奇,这解决了问题!我不认为动态内存分配是必要的,因为我们还没有在课程中进入那部分。我确实认为我需要阅读指针和数组,因为我犯的错误感觉有点愚蠢。
  • 欢迎您!数组和指针是学习 C 时的绊脚石。当您阅读the right books 并进行大量练习时,它会变得更好。祝你好运:)
【解决方案2】:

您的函数datorns_val 被声明为返回char,而实际上它返回valt_ord 类型为char[]。还有一个更大的问题valt_ord 是一个局部变量,所以即使你更改了声明,代码也不起作用。您需要动态分配valt_ord(使用malloc)或将其作为函数参数传递。

【讨论】:

  • 您必须说“将其地址作为函数参数传递”,否则它也不起作用。
  • @Zaibis 要看作者想做什么。我的想法是修改函数中的数组,而不是分配它,避免以这种方式使用动态内存。
【解决方案3】:

strcpy 的参数 2 需要字符串,但您的函数返回字符。

man strcpy.

你试图返回局部变量,当你移出函数时它将被销毁,因为它将数据存储在stack中。使用malloc

see this SO question for further clarification

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 2020-09-12
    • 2021-08-28
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多