当我尝试运行此代码时,它会崩溃。没有错误消息。当程序编译并运行时,它只显示Windows 7消息,“此程序已停止工作。”:
void readGameFile(string ** entries, int * num_entries, string ** story, int * num_lines)
{
ifstream madlib("madlibs1.txt");
string line;
getline(madlib, line);
*num_entries=stoi(line);
*entries=new string [*num_entries];
for (int i=0; i<*num_entries; i++)
{
getline(madlib,*entries[i]);
}
我做了一些测试,似乎为entries[0]
分配了一个值,然后在尝试为entries[1]
赋值时崩溃了。我被迫使用这个函数名,特别是那些函数参数和参数类型。我也可能不会使用我见过的malloc,vector或其他答案。
答案 0 :(得分:1)
我认为这个问题是优先考虑的问题:你几乎可以肯定 想:
getline( madlib, (*entries)[i]) );
否则,您将从string**
编入索引
解除引用:*(entries[i])
。
您还想检查getline
的结果,可能在。{
循环:
for ( int i = 0; madlib && i != *num_entries; ++ i )...
以及std::stoi
之前。
最后:我不知道为什么你被迫使用它
功能签名。它是可怕的C ++,你永远不应该
写这样的东西。逻辑上,std::vector<string>
将是一个更好的解决方案,但即使没有它:你的功能
有4个参数。通过返回可以更好地处理
一个struct
。如果失败了,那么C ++中的参数就是
通常由非const引用实现,而不是由指针实现。
虽然在某些情况下有使用指针的参数,
当它导致指向指针时,它是邪恶的。如果
没别的:
bool // Because we have to indicate whether it succeed or failed
readGameFile( std::string* &entries, int &num_entries, std::string* &story, int &num_lines )
// ...
(这看起来更像它应该是构造函数,
但是,有两个数据元素的类entries
和
story
。)