string s="abcdefghijklmnopqrstuvwxyz"
char f[]=" " (s.substr(s.length()-10,9)).c_str() " ";
我想得到s的最后9个字符,并在子字符串的开头和结尾添加“”,并将其存储为char []。我不明白为什么这不起作用,即使char f [] =“”“a”“”确实如此。
是(s.substr(s.length() - 10,9))。c_str()不是字符串文字?
答案 0 :(得分:5)
不,这不是字符串文字。字符串文字的格式始终为"<content>"
或扩展为格式(宏,例如__FILE__
)。
只需使用其他std::string
代替char[]
。
std::string f = " " + s.substr(s.size()-10, 9) + " ";
答案 1 :(得分:3)
首先,考虑是否应该使用cstrings。在C ++中,通常使用string。
但是,如果您想使用cstrings,"abc" "123"
- &gt;的串联"abc123"
是预处理器操作,因此不能与string :: c_str()一起使用。相反,最简单的方法是构造一个新字符串并获取它的.c_str():
string s="abcdefghijklmnopqrstuvwxyz"
char f[]= (string(" ") + s.substr(s.length()-10,9) + " ").c_str();
(编辑:你知道,在第二个想法,这是一个非常糟糕的主意。在这个语句结束后应该释放cstring,所以使用f会导致段错误。除非你是,否则不要使用cstrings准备捣乱strcpy和所有那些丑陋的东西。说真的。)
如果您想使用字符串,请考虑以下内容:
#include <sstream>
...
string s="abcdefghijklmnopqrstuvwxyz"
stringstream tmp;
tmp << " " << s.substr(s.length()-10,9) << " ";
string f = tmp.str();
答案 2 :(得分:1)
@Xeo告诉您如何解决问题。这里有一些关于如何在编译过程中处理字符串文字的补充背景。
从A.12节预处理The C Programming language:
字符常量和字符串文字中的转义序列(Pars.A.2.5.2,A.2.6)是 取而代之的是等同物;然后连接相邻的字符串文字。
负责连接的是预处理器,而不是编译器。 (您要求C ++答案。我希望C ++以与C相同的方式处理字符串文字)。预处理器对C / C ++语言的了解有限; (s.substr(s.length()-10,9)).c_str()
部分未在预处理器阶段进行评估。