#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"
。
答案 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();
}