【问题标题】:Very basic question on integer variable and string concatenation using "+" in C++ [duplicate]关于在 C++ 中使用“+”进行整数变量和字符串连接的非常基本的问题 [重复]
【发布时间】:2020-11-21 17:37:42
【问题描述】:

我是 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 &lt;&lt; x &lt;&lt; " is greater than " &lt;&lt; y; 可以正常工作,但我不确定为什么连接在这里不起作用。还有,为什么会出现这些奇怪的字符呢?

提前致谢。

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

【问题讨论】:

  • 提示:数字加字符串未定义。在 C++ 中,这一切都是通过 operator+ 定义完成的。其他语言在字符串和数字之间任意转换。 C++ 一般不会。
  • 进一步提示:std::to_string。 en.cppreference.com/w/cpp/string/basic_string/to_string
  • float + int 已定义,并触发转换。 string + other things 不是串联,不会触发转换。在 C++ 中不要假设类型转换会自动发生
  • 你可以试试std::to_string(x) + " is greater than " + std::to_string(y) 让它工作。
  • 更好的提示:数字+字符串是定义的,但不是你想的那样。

标签: c++ string int concatenation


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 2011-05-21
    • 2021-03-29
    • 2017-06-21
    相关资源
    最近更新 更多