2011-05-02 87 views
0

这样你就可以在c执行空调风格字符串++使用char * ...空调风格字符串++问题

我的问题是,你能几乎做任何事情,你可以在正常的字符串,这样做报关..

所以假设你有

char * c; 

你可以这样做:

c = "etcetc"; 
c = c + "dddddd"; 

等?

而且它与字符串几乎可以互换吗?

所以

char * c = "etcetc"; 
string s; 

s = c; 

那会是有效的?

回答

3

C风格的字符串本质上是一个NULL终止的字符数组,而C++中的std :: string是一个精心设计的面向对象的字符串类/对象。 在大多数情况下,它们不可互换并取决于您执行的操作。您始终可以拨打std::string::c_str()以获取内部C风格的字符串。

char * c 

// OK because this makes c point to the starting address of "etcetc", 
c = "etcetc"; 

// Compile-time error! You cannot add two pointers anyway because it's meaningless 
c = c + "dddddd"; 

// OK, because string has constructor "string (const char * s)" 
string s1 = c; 

string s2; 
// OK, because string has "string& operator= (const char* s)" 
s2 = c; 

有一件事值得一提:

// "etcetc" is a constant string here and you cannot modify it via pointer c 
char * c = "etcetc"; 

// You can change string contents in two cases 
char c[] = "etcetc"; 
string str = "etcetc"; 
1

不,你不能连接使用+连接char*;您必须使用strcat和手动分配的缓冲区。这就是为什么std::string类以C++存在的原因。

char*string分配是有效的,因为string类明确支持它。

1

绝对没有,没有。

(char *)是严格指向内存位置的指针。字符串连接需要一个带有源字符串副本的新缓冲区(有关一种方法,请参阅libC文档中的strcat)。

0

char*是指向(地址)char的地址。当你说c = c + "xxx"时,你将一个字符串的地址添加到另一个字符串中。这几乎肯定不是你想要的。

您将需要使用支持连接的字符串类来使用您呈现的语法。否则,您可以调用旧式字符串函数,如strcat()

+0

* “您要添加一个字符串的地址到另一个” * - 真的吗?我以为这不会编译(不能说我曾经尝试过..) – 2011-05-02 04:40:01

+0

我也没有尝试它,但它应该编译。两个表达式都会产生一个'char *',并且C++肯定支持指针加/减。 – 2011-05-02 04:41:18

+0

您可以将整数添加到指针,但不能添加两个指针。请参阅http://stackoverflow.com/questions/2935038/2935044#2935044 – 2011-05-02 16:09:41

0

我最近在Ada和C多年后切换到C++。我发现我从来不使用C风格的字符串,只是将它们转换为字符串(如果我没有选择,可能会再回来)。那样做了,一大堆常见的C问题就消失了。

即为什么char * x="dadada";string x="dadada";后来在代码中更容易?

这是有效的代码,完全符合你的期望,因为c是一个字符串,而不是char *。

string c ; 

.......

c = "etcetc"; 
c = c + "dddddd";