函数未返回所需的字符串

时间:2018-09-27 14:20:05

标签: c++ string function

#include <iostream>
#include <string>

using namespace std;
string wordB(string input);

int main() {
    //ask for word
    cout << "Enter a word\n";

    //get word
    string input = "";
    cin >> input;

    //return with b in between all letters
    cout << wordB(input);
    cout << endl << input;
}

string wordB(string str) {
    string rString = "";

    for (unsigned i = 0; i < str.length(); ++i) {
        rString += "B" + str.at(i);
    }
    cout << endl << rString;

    return rString;
}

试图显示用户输入的单词,每个字符之间都有字母“ B”。当我使用单词"join"运行此命令时,我将返回"trtr"

4 个答案:

答案 0 :(得分:9)

"B" + str.at(i);并没有按照您认为的做;这不是字符串contatenation。它说:用char*指针指向字符串文字"B"的开头,将其前进等于字符str.at(i)的ASCII码的字符数,然后处理结果指针指向以nul结尾的字符串。除非str.at(i)恰好是'\x0''\x1'(不太可能),否则您的程序会表现出不确定的行为。

有许多不同的方法可以完成您想要的事情。这是一个:

rString.push_back('B');
rString.push_back(str[i]);

答案 1 :(得分:2)

从C ++ 14开始提供的一个特别好的修复程序是编写

rString += "B"s + str.at(i);

注意s,它是用户定义的文字。然后,这迫使使用+上的重载std::string运算符,而不是使用内置的+,后者实际上在执行可疑的(可能是未定义的)指针算术const char[2]文字"B"上的em>衰减为const char*

答案 2 :(得分:0)

诚然,这是一个陷阱...

rString += "B" + str.at(i);

"B" + str.at(i)部分未达到预期的效果:它在str.at(i)指针(指向“ B”的第一个字母)上添加了char。解决方法很简单:

rString += std::string("B") + str.at(i);
                        //  ^-------------- now calls the correct operator

出于好奇,请考虑以下问题:

(rString += "B") += str.at(i);

我不建议编写它(它太模糊了),但是它做对了,因为有std::string::operator+(char*)std::string::operator+(char)

答案 3 :(得分:0)

您看到的是order of evaluation的结果。

+=运算符将强制对表达式的右侧求值,并将结果附加到字符串。

这是导致您面临的问题的原因,因为右侧不是std::string,因此+运算符的含义是rhs只是转换为指针算术而不是字符串连接如您所愿。

一个简单的解决方法是更明确地做到这一点:

rString = rString + "B" + str.at(i);

这现在将使编译器首先将=运算符的右侧作为字符串求值,然后进行串联。它还提供了额外的好处,即如果右侧不是字符串,则允许编译器通知您。


另一种替代方法是使用字符串流。我认为它看起来更干净,所以在这里:

#include <sstream>
...

string wordB(string str) {
    std::ostringstream oss;

    for (unsigned i = 0; i < str.length(); ++i) {
        oss << 'B' << str.at(i);
    }
    cout << endl << oss.str();

    return oss.str();
}