2009-10-11 7 views
0

Je suis très confus quant à savoir quand utiliser string (char) et quand utiliser des pointeurs de chaîne (pointeurs char) en C++. Voici deux questions que j'ai. lequel des deux suivants est correct?Comment utiliser les pointeurs de chaîne et de chaîne en C++

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

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

dont l'un des deux suivants est correct?

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

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

Répondre

4

Aucun d'entre eux n'est correct.

La fonction membre sub n'existe pas pour la chaîne, sauf si vous utilisez une autre classe string qui n'est pas std::string.

Le deuxième de la première question subString = &anotherString.sub(9); n'est pas sûr, car vous stockez l'adresse d'un temporaire. Il est également faux car anotherString est un pointeur vers un objet chaîne. Pour appeler la fonction membre sub, vous devez écrire anotherString->sub(9). Et encore, la fonction membre sub n'existe pas.

La première de la deuxième question est plus correcte que la seconde; tout ce que vous devez faire est de remplacer "\"" par '\"'.

Le deuxième de la deuxième question est faux, comme:

  1. doubleQuote ne se réfère pas au 10ème caractère, mais la chaîne à partir du 10 caractère partir
  2. doubleQuote == "\"" peut être de type sage correct, mais il ne compare pas l'égalité des deux cordes; il vérifie s'ils pointent vers la même chose. Si vous voulez vérifier l'égalité des deux chaînes, utilisez strcmp.
0

Pour la première question, le premier échantillon, en supposant que sub renverra une sous-chaîne de la chaîne fournie.

Pour la seconde, aucun:

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

Erm, sont la chaîne que vous utilisez STL?

(vous avez quelque chose comme

#include <string> 
#using namespace std; 

au début de votre fichier source;))

alors ce serait comme

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

ou vous pouvez écrire

mystring.at(9) 

au lieu de crochets.

Peut être these des exemples peuvent aider.

+1

'std :: string' n'appartient pas à la partie de la bibliothèque std issue de la STL. – sbi

+0

Oh, et 'mystring [9]' fonctionne aussi. C'est juste que 'std :: string :: at()' vérifie son argument, alors que 'std :: string :: operator []()' ne le fait pas. Cela dépend de ce dont vous avez besoin. – sbi

3

En C++, vous pouvez (et devez) toujours utiliser std::string (en gardant à l'esprit que les littéraux de chaîne sont en fait des tableaux de caractères à terminaison nulle).Utilisez char* uniquement lorsque vous avez besoin d'une interface avec le code C.

Les chaînes de style C nécessitent une gestion manuelle de la mémoire, doivent copier explicitement les chaînes (la copie des pointeurs ne copie pas la chaîne), et vous devez faire attention à des détails comme '\0' dans, tandis que std::string prend soin de tout cela automagiquement.