字符串赋值的分段错误

时间:2012-05-11 15:32:36

标签: c++ string segmentation-fault assign

我有一个文本文件,其中只包含带有以下消息的行:

  

你好   你好吗

现在我得到了这个函数,它读取这些行并返回一个包含它们的数组。

string* printlines(string filename)
{
string line;
int sum = 2;
int i =0;
string *quotes;
ifstream infile(filename.c_str());

quotes= new string[2];

    if (infile.is_open())
    {

      while (infile.good())
      { 
        getline (infile,line);
        quotes[i] = line; // <--- here's the problem
        i++;
       }
    }
infile.close();
return quotes;
}

gdb报告粗体行有问题,但我没有看到。

2 个答案:

答案 0 :(得分:2)

如果你读了两行以上的麻烦,你可以在堆上分配两个字符串。如果要返回动态分配的字符串数组,可以使用std::vector,如下所示:

std::vector<std::string> printlines(const std::string& filename)
{
    std::vector<std::string> quotes;
    std::ifstream infile(filename.c_str());

    if (infile.is_open())
    {
        while (infile.good())
        {
            std::string line;
            std::getline (infile,line);
            quotes.push_back(line);
        }
    }
    infile.close();

    return quotes;
}

这样你就不需要关心有多少字符串被读取它会不断增长为所有字符串腾出空间你不需要担心内存泄漏,当它出去时,向量会删除所有字符串范围。

答案 1 :(得分:2)

循环结构不正确,将导致超出数组的末尾。即使文件中只有两行,但在getline()之后不会立即检查以确定是否成功。将读取前两行,但尚未设置eof,导致第三次getline()调用,超出数组末尾。

更改为:

while (getline(infile, line) && i < 2)
{
    quotes[i] = line;
    i++;
}

话虽如此,考虑使用std::vector<std::string>代替数组:

std::vector<std::string> quotes;
while (getline(infile, line))
{
    quotes.push_back(line);
}

std::vector将动态增长以存储所有读取行。可以将新行添加到文本文件中,而无需更改代码。