c++ - 关于在 C++ 中使用 "+"的整数变量和字符串连接的非常基本的问题

标签 c++ string int concatenation

<分区>

我是 C++ 的新手,这个问题对很多人来说可能看起来微不足道,但请记住,我才刚刚开始学习 C++ 语言。

我已经分配了一个变量 x等于20并想将它与一个字符串连接起来。我的 C++ 代码如下。

#include <iostream>
#include <string>
#include <cmath>
using namespace std;

int main() {
  int x = 20;
  int y = 15;
  if (x >= y) {
    cout << x + " is greater than " + y;
  }
}

我的预期结果是 20 is greater than 15 , 但出现的却是一些奇怪的 é@ .我很困惑,我无法在 GeeksForGeeks、w3schools 或其他 SO 上找到解决方案。

我知道使用 cout << x << " is greater than " << y;工作得很好,但我不确定为什么串联在这里不起作用。还有,为什么会出现这些奇怪的字符呢?

提前致谢。

(此外,请不要在没有回答问题的情况下留下答案。我记得在启动 JS 时我问了一个问题,唯一的答案是“不要使用 document.write”。虽然我明白了,但它会是实际回答问题并将其作为旁注要好得多。)

最佳答案

你得到一些奇怪输出的原因是 C++ 历史的一部分是 C 的演变。在表达式 x + "is greater than "+ y 中,表达式 "大于" 是一个 const char* 文字,它是一种原始的 C 风格类型。由于向后兼容的原因,它不是像 std::string 这样的 C++ 类类型。

您的 + 符号将整数添加到 const char*。这导致指针算术。基本上,"大于 " 是一个 const char*,它是指向内存缓冲区的指针,其内容是 的 ASCII 字节"大于 "。添加 xy 的效果是将指针移动到右边的 35 个字节,它将离开缓冲区的末尾并读取未初始化的内存。那就是出来的“奇数字符”。正确地说,这是未定义的行为,所以任何事情都可能发生。在实际系统中,这只是缓冲区溢出读取,导致乱码。

正如其他人所指出的,解决此问题的一种方法是对整数使用 std::to_string。然后,您将得到处理得更好的 std::string + const char* + std::string 而不是 int + const char* + int

如果不清楚,您可以查找指针、C 风格字符串和缓冲区溢出以获取更多信息。

编辑:从技术上讲,字符串文字是const char[],但为了清楚起见,我省略了这一点。

关于c++ - 关于在 C++ 中使用 "+"的整数变量和字符串连接的非常基本的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63199187/

相关文章:

c++ - 链接到 visual studio 2013 boost

java - 递归手动方式将int转换为字符串(没有数组,列表或解析内容),以获取正数和负数

C:scanf 和 getchar 行为的差异

c++ - 试图从类中调用函数

c++ - 预处理器 IDE 是唯一的功能吗?

Android NDK 构建 .so 但 Unresolved inclusion 所有包含

c - 如何将char值合并为int?

c# - 从 C# 中的字符串中提取基本 URl?

c - C 中的反向函数产生单词然后产生垃圾

java - 为什么当变量是字符串时程序打印数字?