【问题标题】:C++ Concatenation OopsC++ 连接糟糕
【发布时间】:2012-07-26 17:57:33
【问题描述】:

所以我最近在 C++、C# 和 Java 之间来来回回,并且写了一些 C++ 代码,我做了类似的事情。

string LongString = "Long String";

char firstChar = LongString.at(0);

然后尝试使用看起来像这样的方法,

void MethodA(string str)
{    
//some code    
cout << str;    
//some more code }

这是我的实现方式。

MethodA("1. "+ firstChar );

虽然在 C# 和 Java 中完全有效,但这在 C++ 中却做了一些奇怪的事情。

我期待类似的东西

//1.升

但它在程序后面给了我一些其他字符串文字的一部分。

我实际上做了什么?

我应该注意我已经修复了这个错误,以便它打印出我所期望的,但我真的对我错误地做了什么感兴趣。

提前谢谢。

【问题讨论】:

  • @cdhowie 感谢您的编辑。如何使语法突出显示起作用?下次我想自己做。
  • @Dan 你可以点击编辑链接查看编辑后的文字。
  • @cdhowie 我查看了文本和差异,但我无法看到您为使语法突出显示工作所做的工作。是否有我缺少的常见问题解答或只是一个不可见的字符(如选项卡)?
  • @Dan 每行代码前四个空格。或者,输入代码,选择它并单击工具栏上的{} 按钮,它将为您应用四空格缩进。

标签: c++ concatenation cout


【解决方案1】:

C++ 没有将字符串文字上的加法定义为连接。相反,字符串文字 衰减 指向其第一个元素的指针;单个字符被解释为数值,因此结果是从程序只读内存段中的一个位置到另一个位置的指针偏移量。

要将加法作为连接,请使用std::string

MethodA(std::string() + "1. " + firstChar);

【讨论】:

  • 请注意,这会将参数的类型从const char* 更改为std::string(取决于MethodA 的声明,这可能没问题)。此外,等效但稍好:std::string("1. ") + firstChar
【解决方案2】:
MethodA(std::string("1. ")+ firstChar );

因为 "1." 是 const char[4] 并且没有 concat 方法)

【讨论】:

    【解决方案3】:

    问题在于"1. " 是一个字符串文字(字符数组),它会衰减为一个指针。字符本身是一个char,可以提升为int,添加const char*int定义为通过将原始指针偏移那么多位置来计算新指针。

    您在 C++ 中的代码正在调用 MethodA,结果是将 (int)firstChar(字符的 ASCII 值)添加到字符串文字 "1. ",如果 firstChar 的值大于 4(它可能是)将是未定义的行为。

    【讨论】:

      【解决方案4】:
      MethodA("1. "+ firstChar );  //your code
      

      没有做你想让它做的事情。它是一个指针运算:它只是将一个整数值(即firstChar)添加到字符串文字"1. " 的地址,然后将结果(char const* 类型)传递给函数,在那里它转换为string 类型。基于firstChar 的值,它可以调用未定义的行为。 事实上,在您的情况下,它确实会调用未定义的行为,因为结果指针指向字符串文字之外。

      这样写:

      MethodA(string("1. ")+ firstChar ); //my code
      

      【讨论】:

      • @downvoter:请解释反对意见,以便我更正自己。
      【解决方案5】:

      C++ 中的字符串文字不是std::string 的实例,而是chars 的常量数组。因此,通过向其添加 char 隐式转换为字符指针,然后将字符的数值递增,这恰好指向存储在 .data 部分中的另一个字符串文字。

      【讨论】:

        猜你喜欢
        • 2012-08-03
        • 2017-06-25
        • 2014-09-07
        • 2022-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-09
        • 1970-01-01
        相关资源
        最近更新 更多