这个字符串赋值有什么问题?

时间:2011-11-30 07:26:13

标签: c++ string

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()不是字符串文字?

3 个答案:

答案 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()部分未在预处理器阶段进行评估。