c++ 是什么原因导致此输出排印错误?[duplicate]

6l7fqoea  于 2022-12-27  发布在  其他
关注(0)|答案(2)|浏览(160)
    • 此问题在此处已有答案**:

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++ 的新手。

mftmpeh8

mftmpeh81#

第一个月
问题是ageint,并且没有+的重载将int转换为可以连接到std::string上的类型。
要解决这个问题,必须将age转换为字符串。一个简单的方法是使用std::to_string
bio += "\nAge: " + std::to_string(age);
至于没有将整数转换为字符串时会发生什么:
因为(我假设是ASCII)值30是"记录分隔符",也就是控制字符之一,所以你基本上把一个控制字符连接到字符串上,而不是字符串"30"
std::stringoperator ++=将允许连接单个字符,不幸的是,由于整数被转换为字符值,因此代码编译时没有错误。
编辑:
仔细查看原始代码后,可以发现,实际行为是将字符串字面值"\nAge: "增加30个字节,指向who-knows-where。如果std::string将该值用作连接值,则实际上会产生未定义的行为。
无论如何,age都将转换为整数30,并且无论它是用于向字符串"添加"(如前所述),还是用于将文字增加30个字节,它仍然会产生不希望出现的行为。

juzqafwq

juzqafwq2#

在字符串中添加int是问题的根源,我建议您使用std::stringstream来构建字符串,并且view_profile可以标记为const,因为在常量Profile对象上调用是安全的。

std::string view_profile() const {
    std::ostringstream ss;
    ss << "Name: "     << name     << std::endl
       << "Age: "      << age      << std::endl
       << "City: "     << city     << std::endl
       << "Country: "  << country  << std::endl
       << "Pronouns: " << pronouns << std::endl;

    return ss.str(); 
  }

相关问题