所以我最近在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。 →
但它在程序的后期给了我一些其他字符串文字。
我到底做了什么?
我应该注意到我已经修正了这个错误,以便打印出我期望的内容,但我真的对我错误的做法感兴趣。
提前致谢。
答案 0 :(得分:3)
MethodA(std::string("1. ")+ firstChar );
因为“1.”是const char [4]并且没有连接方法)
答案 1 :(得分:3)
C ++没有将字符串文字的添加定义为连接。相反,字符串文字衰减指向其第一个元素的指针;单个字符被解释为数字值,因此结果是指针从程序的只读内存段中的一个位置偏移到另一个位置。
要添加为连接,请使用std::string
:
MethodA(std::string() + "1. " + firstChar);
答案 2 :(得分:2)
MethodA("1. "+ firstChar ); //your code
没有做你想做的事。它是一个指针算术:它只是将一个整数值(firstChar
)添加到字符串文字"1. "
的地址,然后传递结果(属于char const*
类型)到函数,它转换为string
类型。基于firstChar
的值,它可以调用未定义的行为。 实际上,在您的情况下,它会调用未定义的行为,因为结果指针指向超出字符串文字。
写下这个:
MethodA(string("1. ")+ firstChar ); //my code
答案 3 :(得分:2)
问题是"1. "
是一个字符串文字(字符数组),它会衰变为指针。角色本身是char
,可以提升为int
,添加const char*
和int
定义为通过偏移原始指针来计算新指针通过那么多职位。
您在C ++中的代码正在调用MethodA
,其结果是将(int)firstChar
(字符的ASCII值)添加到字符串文字"1. "
,如果值为firstChar
大于4(它可能是)将是未定义的行为。
答案 4 :(得分:1)
C ++中的字符串文字不是std::string
的实例,而是char
的常量数组。因此,通过向其添加char
隐式转换为字符指针,然后通过字符的数值递增,恰好指向存储在.data节中的另一个字符串文字。