- 此问题在此处已有答案**:
How do you append an int to a string in C++? [duplicate](20个答案)
How to concatenate a std::string and an int(24个答案)
Why can you add an integer to a string literal?(1个答案)
Adding strings and literals (C++)(3个答案)
2天前关闭。
我正在编写这个简单的程序,该程序应该创建一个具有给定属性的用户配置文件。我正在测试view_profile()
方法,该方法应该只返回一个具有构造函数给定值的字符串。当我运行该程序时,我没有得到错误,但输出不是预期的。我想知道为什么在输出中的名称:Sam Drakillanouns出现,而不是姓名:萨姆·德拉基拉,同样,年龄变量也没有显示。
#include <iostream>
#include <vector>
using namespace std;
class Profile {
private:
string name;
int age;
string city;
string country;
string pronouns;
vector<string> hobbies;
public:
//Constructor
Profile(string name1, int age1, string city1, string country1, string pronouns1 = "they/them") {
name = name1;
age = age1;
city = city1;
country = country1;
pronouns = pronouns1;
}
//View Profile method
string view_profile() {
string bio = "Name: " + name;
bio += "\nAge: " + age;
bio += "\nCity: " + city;
bio += "\nCountry: " + country;
bio += "\nPronouns: " + pronouns;
bio += "\n";
return bio;
}
};
int main() {
Profile sam("Sam Drakkila", 30 , "New York", "USA", "he/him");
cout << sam.view_profile();
}
我的输出是:
Name: Sam Drakillanouns:
City: New York
Country: USA
Pronouns: he/him
何时应为:
Name: Sam Drakilla
Age: 30
City: New York
Country: USA
Pronouns: he/him
我试着检查构造函数和方法view_profile()
,但一切似乎都是正确的。我可能忽略了一些东西,因为我是 C++ 的新手。
2条答案
按热度按时间mftmpeh81#
第一个月
问题是
age
是int
,并且没有+
的重载将int
转换为可以连接到std::string
上的类型。要解决这个问题,必须将
age
转换为字符串。一个简单的方法是使用std::to_string
:bio += "\nAge: " + std::to_string(age);
至于没有将整数转换为字符串时会发生什么:
因为(我假设是ASCII)值30是"记录分隔符",也就是控制字符之一,所以你基本上把一个控制字符连接到字符串上,而不是字符串
"30"
。std::string
的operator +
和+=
将允许连接单个字符,不幸的是,由于整数被转换为字符值,因此代码编译时没有错误。编辑:
仔细查看原始代码后,可以发现,实际行为是将字符串字面值
"\nAge: "
增加30个字节,指向who-knows-where。如果std::string
将该值用作连接值,则实际上会产生未定义的行为。无论如何,
age
都将转换为整数30,并且无论它是用于向字符串"添加"(如前所述),还是用于将文字增加30个字节,它仍然会产生不希望出现的行为。juzqafwq2#
在字符串中添加int是问题的根源,我建议您使用
std::stringstream
来构建字符串,并且view_profile
可以标记为const
,因为在常量Profile
对象上调用是安全的。