函数调用后字符串更改

时间:2014-07-29 02:36:55

标签: c++

我可能犯了一个非常明显的错误,但我无法看到它,我希望有人可以帮助我。

我想在我的C ++程序中将2个字符串添加到对向量中。容器看起来像vector< pair < word , type > > vec。这个词可以是任何东西,类型是名词,形容词,动词等。例如< Hogwarts , noun>< Hungry, adjective>等。

我在这里将单词添加到单词bank中。 FileStrings只是从File I / O创建的另一个容器。这里一切都很好。

for(unsigned int i = 0; i < fileStrings.size(); ++i)
{
    cout << "Adding " << fileStrings[i] << ", " << fileStrings[i + 1] << endl;
    theWordBank.addWord(fileStrings[i], fileStrings[++i]);
}

在这里,我迷路了。打印出newWord时,它与newType完全相同。我无法理解它,我也不理解newWord如何从上面的代码片段中失去其价值。

void addWord(const string& newWord, const string& newType)
{
    mWords.push_back(make_pair(newWord, newType));
    std::cout << "newWord " << newWord << ", " << newType << std::endl;
}

再次,结果应该是< Hogwarts, noun>,但我得到< noun, noun>对mWords向量中的所有内容。我认为它甚至没有任何关于mWords的东西。我的addWord函数的赋值列表是否出错?

3 个答案:

答案 0 :(得分:5)

这可能是你的问题:

theWordBank.addWord(fileStrings[i], fileStrings[++i]);

未定义的行为在表达式中多次使用i,其中您还使用++i(或其他递增/递减运算符)。这样做:

for(unsigned int i = 0; i < fileStrings.size(); i += 2)
    theWordBank.addWord(fileStrings[i], fileStrings[i + 1]);
}

在表现上绝对没有明显差异。

答案 1 :(得分:1)

您的代码还有其他问题。您正在访问cout中的向量范围之外的元素。

for(unsigned int i = 0; i < fileStrings.size(); ++i)
{
    cout << "Adding " << fileStrings[i] << ", " << fileStrings[i + 1] << endl;

假设fileStrings包含1个项目。 fileStrings[i+1]将尝试访问fileStrings[1],这是一种越界访问。

答案 2 :(得分:0)

在C ++中,未定义评估函数参数的顺序。完全有可能在您的实现中,theWordBank.addWord(fileStrings[i], fileStrings[++i]);中的第二个参数在第一个参数之前进行评估。

请注意,你不应该依赖于此;当您调用未定义的行为时,您的编译器可以随心所欲地执行任何操作。它可能表现不一致。它似乎现在可以工作,然后用不同的编译器版本神秘地失败。将其更改为不依赖于参数评估顺序的内容,例如

theWordBank.addWord(fileStrings[i], fileStrings[i+1]);
++i;