【问题标题】:Initialising a vector with anoter vector, returned from a function用函数返回的另一个向量初始化一个向量
【发布时间】:2021-12-28 00:12:53
【问题描述】:

我正在尝试创建一个名为mems 的向量,它是使用我的myMembers() 函数返回的向量声明的。出于某种原因,当我使用该行时:

vector<string> mems = myMembers(); 返回错误:

terminate called after throwing an instance of 'std::logic_error'
what():  basic_string::_M_construct null not valid

此错误不会在编译时出现,而是在程序到达这行代码时出现。我已经研究了几个小时来解决它,但我真的不确定。

目前我写的代码如下:

vector<string> Person::myMembers(){
    fstream file;
    file.open("myFile.txt");
    string myLine;
    vector<string> mems;
    

    while(getline(myFile, myLine)){
        vector<string> myLine = split(myLine, ',');
        mems.push_back(myLine.at(0));
        for (int i = 5; i < myLine.size(); i++){
            mems.push_back(myLine.at(i));
        }
    }
    return mems;
}

上述函数将获取索引 0 处的名称,以及索引 5 到 n 的名称列表。然后它将这些名称放入一个名为mems 的向量中,并返回它。

(我应该让你知道 split 是我编写的一个函数,它会简单地用指定的分隔符分割一行,然后将它放入一个向量中)。

然后,稍后在我的代码中,我创建了一个名为 mems 的新向量,并将其设置为等于 myMembers() 的输出

vector&lt;string&gt; mems = myMembers()

我知道是上面那行代码导致了错误,但我不知道为什么,也不知道如何解决。

任何帮助将不胜感激。

感谢您的宝贵时间 :)

编辑

提到错误可能是 splitString 的一部分,请在下面找到我的 SplitString 函数的代码:

vector<string> split(string myString, char delimiter){
    string temp = 0;
    vector<string> splitString;

    for (int i = 0; i < myString.size(); i++){
        if (myString[i] != delimiter){
            temp += myString[i];
        } else {
            splitString.push_back(temp);
        }
    }
    return splitString;
}

【问题讨论】:

  • 您不应将 null 传递给 string 构造函数。您在哪里以及如何做到这一点...
  • mems.push_back(myLine.at(0)); 如果该行为空,则以某种方式致命。
  • 错误是说 std::string 是用 nullptr 作为输入构造的,但我在显示的代码中没有看到这样的构造,所以它必须在未显示的代码中(也许在split() 内部,也许?)。如果您在调试器中运行此代码,它会准确告诉您失败的string 的构造位置。

标签: c++ vector file-handling


【解决方案1】:

我发现了该程序的问题。 split() 函数导致错误,因为temp 被初始化为string temp = 0;,这意味着它试图用整数值初始化字符串。

split()函数的正确代码如下:

ector<string> split(string myString, char delimiter){
    string temp = "";
    vector<string> splitString;

    for (int i = 0; i < myString.size(); i++){
        string temp = "";
        if (myString[i] != delimiter){
            temp += myString[i];
        } else {
            splitString.push_back(temp);
        }
    }
    return splitString;
}

这让 split() 函数返回一个非空字符串,并允许程序按应有的方式运行。

【讨论】:

    猜你喜欢
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    相关资源
    最近更新 更多