2009-10-11 137 views
0

我非常困惑什麼時候使用字符串(char)以及何時在C++中使用字符串指針(char指針)。這是我有兩個問題。 以下哪兩項是正確的?如何在C++中使用字符串和字符串指針

string subString; 
subString = anotherString.sub(9); 

string *subString; 
subString = &anotherString.sub(9); 

以下哪兩個是正確的?

char doubleQuote = aString[9]; 
if (doubleQuote == "\"") {...} 

char *doubleQuote = &aString[9]; 
if (doubleQuote == "\"") {...} 

回答

4

沒有一個是正確的。

成員函數sub對於字符串不存在,除非您使用的另一個string類不是std::string

第一個問題subString = &anotherString.sub(9);的第二個問題是不安全的,因爲您正在存儲臨時地址。這也是錯誤的,因爲anotherString是一個指向字符串對象的指針。要調用sub成員函數,您需要編寫anotherString->sub(9)。而且,成員函數sub不存在。

第二個問題的第一個比第二個問題更正確;您只需將"\""替換爲'\"'即可。

第二個問題的第二個是錯誤的,因爲:

  1. doubleQuote並不是指10日的性格,但是從第10字符的字符串開始
  2. doubleQuote == "\""可能是類型英明正確,但它並不比較兩個字符串的平等性;它會檢查它們是否指向相同的東西。如果你想檢查兩個字符串的相等性,請使用strcmp
0

對於第一個問題,第一個示例,假設子將返回提供的字符串的子字符串。

對於第二個,沒有一個:

char doubleQuote = aString[9]; 
if(doubleQuote == '\"') { ... } 
0

呃,您使用的字符串從STL?

(即你有類似

#include <string> 
#using namespace std; 
在源文件的開頭

;))

那麼它會像

string mystring("whatever:\"\"""); 
char anElem = mystring[9]; 
if (anElem=="\"") { do_something();} 

,或者你可以寫

mystring.at(9) 

而不是方括號。

可能是these的例子可以提供幫助。

+1

'std :: string'不屬於來自STL的標準庫的那部分。 – sbi 2009-10-11 16:47:44

+0

哦,'mystring [9]'也可以。這只是'std :: string :: at()'檢查它的參數,而'std :: string :: operator []()'不會。這取決於你需要什麼。 – sbi 2009-10-11 16:49:04

3

在C++中,您可以(也應該)始終使用std::string(同時記住字符串文字實際上是零終止的字符數組)。僅當您需要與C代碼連接時才使用char*

C風格的字符串需要易出錯的手動內存管理,需要顯式複製字符串(複製指針不會複製字符串),並且需要注意細節,如分配足夠的內存以使終止'\0'中,而std::string照顧所有這一切的自動化。