返回带有随机选项和局部变量的 char 函数

Posted

技术标签:

【中文标题】返回带有随机选项和局部变量的 char 函数【英文标题】:return a char function with random options and local variables 【发布时间】:2016-01-27 09:12:06 【问题描述】:

我创建了一个单元测试工具来测试我的程序。我希望它能够随机测试每次运行,但我不知道如何去做。这是我的想法,但我被困在下一步该怎么做,任何指导将不胜感激。

int main (void)

  int testNumber = 1; //for testing
  char carName[] = "";
  double carCost = 0;

  carName = carChosen (testNumber);
  carCost = assessCost (carName); //assessCost takes in the car name and checks what cost of the car will be (error checking so only certain cars can be chosen)

  return 0;

“testNumber”通常会随时间播种以创建从 1 到 15 的不同数字,但在这种情况下,它将是“1”用于测试。

这是我遇到的下一个问题。在这个函数中会有 15 个不同的汽车选项,它会根据随机创建的数字返回一个。

char carChosen (int randNum)

  char carOne[] = "Honda";
  char carTwo[] = "Ford";
  if (randNum == 1)
  
    return carOne; //local variables, not going to work...
  
  else if (randNum == 2)
  
    return carTwo; // Again, these return's are here to better represent what I'm trying to create but failing to do so..
  

我知道你不能返回局部变量,我能做些什么呢?

【问题讨论】:

您将返回值设置为char,并尝试返回char[]。如果 randNum 不同于 1 & 2,你还需要返回一些东西 @Robolisk 您的 C++ 代码看起来像 C。如果确实是 C++,只需使用 std::string(并在 main(void) 中删除 void)。 @Biffen 它是 C++,我刚刚开始熟悉它。我会研究一下这些对我有什么帮助,谢谢 @Thomas 我明白这一点,但我把它放在那里是因为我被卡住了,不知道还能做些什么来表达我的观点。 else return 应该有一些东西你是对的,我只是为了测试目的而使用它,但良好的实践表明我应该这样做。谢谢你的建议。 char carName[] = "" 不是 C++ 字符串,它是一个以空字符结尾的字符数组,由单个字符(显然是空字符)组成。您可以更改此数组的内容,但由于它是作为单字符数组静态分配的,因此您唯一能做的就是更改该单字符(这显然会使其成为非空终止数组个字符)。简单来说,您需要阅读更多关于空终止(C 样式)字符串的内容。或者,如果您指定的语言确实是 C++,那么请改用 std::string 【参考方案1】:

这个

void carChosen (int randNum, char * out)

  char carOne[] = "Honda";
  char carTwo[] = "Ford";
  if (randNum == 1)
  
    strcpy(out, carOne); 
  
  else if (randNum == 2)
  
     strcpy(out, carTwo); 
   //.. handle other cases

打个电话

  char carName[MAX_LEN];
  carChosen (testNumber, carName);

如果你有很多条件要测试,也许你最好使用switch而不是嵌套的if..else

我以为是 C 看代码,如果你使用 C++,你可以从你的函数中返回 std::string 对象,没有任何问题。

【讨论】:

那将是一个空白,不是吗? 比一个开关更好,一个二维字符数组 这工作非常出色 Giorgi Moniava!谢谢@Thomas 第二个字符数组是什么意思?.... >.> 创建一个名为cars的数组,把你的车放进去,然后strcpy只cars[randNum]@Robolisk 这是一个弱设计,因为没有检查缓冲区溢出(这样做会很痛苦)【参考方案2】:

正如其他人所指出的,您的代码看起来像 C 代码。如果您想使用 C++,请阅读 std::string 并使用它。

如果您想继续使用您的方法(这是一种非常类似于 C 的方法),那么您需要更好地了解 C 字符串的工作原理。即,它们如何存储在内存中以及charchar * 的不同之处与char array[] 的不同之处。

暂时搁置大部分内容,根据您的示例代码,我的第一个猜测是您实际上不会修改字符串的内容。你只想要字符串 for 它的内容,但你不会改变它们。如果这是准确的,那么您可以使用常规的 char * 变量来保存指向 char 字符串的指针。您只需要一个字符串的副本,因此您可以传递一个指向该副本的指针,每个人都可以从该指针中读取。一种快速的方法是直接使用字符串文字。

const char* carChosen (int randNum)

  if (randNum == 1)
  
    return "Honda";
  
  else if (randNum == 2)
  
    return "Ford";
   
  else 
  
    return "Audi";
  

请注意,我们返回的是 const char *const 只是表明我们不会修改指向的字符串。我们绝对不想这样做,因为它指向字符串文字(不允许修改)。一旦你得到了 carChosen 返回的 const char *,你可以将它传递给其他函数,例如评估成本。

【讨论】:

以上是关于返回带有随机选项和局部变量的 char 函数的主要内容,如果未能解决你的问题,请参考以下文章

错误:函数返回局部变量的地址

警告:函数返回局部变量的地址 [默认启用] [重复]

C 语言C 项目开发代码规范 ( 形参合法性判断 | 函数返回值局部变量 | 函数中不用全局变量 | 函数中使用局部变量接收形参 | 函数返回值 | 形参作返回值 | 形参返回值处理 )

C返回char []警告“返回局部变量的地址”[重复]

022.强化训练三

局部变量和全局变量的区别