我有一个关于C++中字符串拼接的问题。
string str = "ab" + 'c';
cout << str << endl;
char ch = 'c';
string str1 = "ab";
string str2 = str1 + ch;
cout << str2 << endl;
这段代码会输出:
ed before SaveGraphicsState
abc
请问有人能解释一下这行代码的处理过程吗:string str = "ab" + 'c';
?
我有一个关于C++中字符串拼接的问题。
string str = "ab" + 'c';
cout << str << endl;
char ch = 'c';
string str1 = "ab";
string str2 = str1 + ch;
cout << str2 << endl;
这段代码会输出:
ed before SaveGraphicsState
abc
请问有人能解释一下这行代码的处理过程吗:string str = "ab" + 'c';
?
你对第一行的想法是正确的,这正是正在发生的事情。
像"ab"
这样的字面字符串没有默认的+
运算符,所以编译器会将其作为C风格字符串,并使用指向该字面值的const char*
指针。然后将您的字面字符'c'
提升为具有某个值的int
。然后将此int
添加到字面值的地址并用作C字符串。由于您已超出分配给文字字符串的空间,因此结果未定义,并且它只打印了从结果地址中找到的字符,直到找到一个空字符。
如果您想一次性创建字符串,可以通过强制转换帮助编译器首先将其转换为string
:std::string str = std::string("ab") + 'c';
。另外(如在单独的评论中所见),也可以使用连接来完成此操作,这可能更有效率。请使用其中哪个在您的情况下更清晰: std::string str = "ab"; str += 'c';
。
在第二种情况下,您已经创建了一个string
,并且string
有一个重载的operator+
,它执行直观的连接。
string str = "ab" + 'c';
字符串字面值不能像那样进行串联。"ab"
是一个字符数组,因此在此上下文中它会退化为指针,您正在向该指针添加一个整数 'c'
。所以指针将按照 'c'
的 ASCII 值前进。
也就是说,上面的代码等价于:
char char * s= "ab";
string str = &s['c']; //the ascii value of 'c' acts like an index to the array.
我确定那不是你想要的。实际上,它会调用未定义的行为,因为&s['c']
引用的内存区域可能不在进程的地址空间内。
你真正想做的事情(即连接字符串),其简短形式如下:
string str = string("ab") + "c";
将字符串str1赋值给str2,然后在str2末尾添加字符ch。
- John Dibling"ab"+'c'
不等同于 "ab"['c']
。前者是一个指针,后者是一个字符。 - Robᵩ您的猜测是正确的,除了字符串文字不在堆栈上,它在内存中的特定位置,通常在只读段中。
"ab"
是一个C字符串。
'c'
这是一个字符。
尝试:
string str = string("ab") + "c";
如果你想让它更简单,总有办法:
string str = "ab";
str += 'c';
或者,您可以使用 std::stringstream
:
stringstream ss;
ss << "ab" << 'c';
运算符重载仅在至少一个重载运算符的参数是用户定义类型(即类实例)时才起作用,因此+运算符无法被重载以添加字符字符串和字符并执行合理操作。最好的情况是进行指针算术运算-几乎肯定不是您想要的结果。通常的解决方法是进行显式转换:
string s = string( "foo" ) + "bar"; // s will contain "foobar"
"ab"
是一个 const char *
。 'c'
是一个 char
。 我猜测 'c'
被转换为整数,该整数加上 "ab"
的地址,然后将得到的指针传递给 std::string
的构造函数。你很幸运它没有崩溃。
请参见其他答案以了解如何正确地进行连接。
string str = "ab" + 'c';
的作用类似于:string tmp = stirng("ab"); // implicit conversion
tmp = tmp + 'c'; // uses overloaded + operator
str = tmp;
这是内置于C++中的:
#include <iostream>
#include <string>
int main()
{
std::string s("Stand back! I've got jimmies!" "DDD");
std::cout << "Stand back! I've got jimmies!" "DDD";
}
输出:
Stand back! I've got jimmies!DDD