0

当我尝试运行此代码时,它会崩溃。没有错误消息。当程序编译并运行时,它只显示 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 或我见过的其他答案。

4

1 回答 1

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++ 中的 out 参数 通常由非常量引用实现,而不是由指针实现。虽然在某些情况下使用指针存在争议,但当它导致指向指针的指针时,它是邪恶的。如果没有别的:

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。)

于 2013-10-17T08:31:55.873 回答