2010-12-15 27 views
1

Je veux construire un objet std :: chaîne comme un tableau:Construire std :: string comme un tableau

std::string str(""); 
str[0] = 'A'; 
str[1] = 'b'; 
str[2] = 'h'; 
str[3] = 'i'; 
str[4] = '\0'; 
std::cout<<str; 

Mais il ne marche pas imprimer la chaîne. Qu'est-ce que je rate?

Répondre

4

Essayez

std::string (4, ' '); 

au lieu de

std::string(""); 

opérateur de basic_string [] renvoie une référence au caractère spécifié, mais étant donné que votre chaîne est vide, il ne contient pas de caractères.

+0

Je l'ai eu. Merci. – badmaash

+2

En fait, je n'aime pas ce constructeur de std :: string car si vous ne pouvez pas vous souvenir de l'ordre et que vous mettez le caractère en premier, il se compilera et vous donnera la mauvaise chose. Si vous faites std :: string ('', 4) il vous donnera une chaîne de longueur 32 (ASCII de l'espace) remplie de caractères ASCII 4. Problème malheureux de char ayant des conversions implicites avec size_t. – CashCow

+0

@CashCow: Je suis d'accord, il est inconvenant que 'char' représente à la fois un caractère et se comporte comme un entier ... –

1

Vous avez alloué la chaîne à "", c'est-à-dire, exactement 0 octets de long.

Vous essayez alors d'écrire des caractères en dehors des limites de la chaîne - ce qui ne fonctionne pas.

+0

Je vois. N'y at-il un moyen de modifier la chaîne déclarée ci-dessus, sauf à l'aide d'insert()? – badmaash

+0

@Abhi: Regardez la documentation pour la chaîne ([SGI] (http://www.sgi.com/tech/stl/basic_string.html), [C++ Reference] (http://www.cplusplus.com/reference/string/string /)). Il y a ([too] (http://www.gotw.ca/gotw/084.htm)) beaucoup de différentes fonctions membres qui fonctionnent sur la chaîne, y compris 'resize()' qui va, bien, redimensionner la chaîne de sorte que vous peut le faire grandir. –

-1

vous devez créer un espace dans la mémoire pour votre tableau

using namespace std; 

char str[5]; 

str[0] = 'A';  
str[1] = 'b';  
str[2] = 'h';  
str[3] = 'i';  
str[4] = '\0'; 

cout << str ; 
+0

Je veux utiliser std :: string. Je sais que je peux le faire avec un tableau de caractères. – badmaash

9

Tout d'abord, std::string n'est pas une chaîne C. Vous n'avez pas besoin de le terminer par NULL. Deuxièmement, l'opérateur [] n'est valide que pour les indices < std::string::length(), ce qui signifie qu'au moins N éléments doivent être attribués à l'avance avant de pouvoir accéder à un élément entre 0 et N-1.

std::string str(4); // construct a string of size 4 
str[0] = 'A'; 
str[1] = 'b'; 
str[2] = 'h'; 
str[3] = 'i'; 
std::cout << str; 

Édition: Mais voir aussi Johnsyweb's answer. Le grand avantage de std::string sur C-cordes est que vous n'avez pas à vous soucier de l'allocation de mémoire. Vous pouvez utiliser l'opérateur += ou la fonction membre push_back et créer la chaîne caractère par caractère sans vous soucier de la quantité de mémoire à réserver.

+0

ne devrait-il pas être std :: string (4, ''); ? – badmaash

+1

@Abhi: le deuxième argument est optionnel, s'il n'est pas présent, il sera par défaut '' \ 0'' (au lieu de l'espace). C'est à vous de déterminer si vous préférez que les éléments non initialisés soient des espaces ou des caractères NUL. –

2

Que manque-t-il?

Il vous manque tout le point d'utiliser un std::string. Cette approche peut fonctionner pour les tableaux de char, mais pas pour les chaînes.

Considérons std::string::operator += à la place.

+2

Selon toute probabilité, c'est en fait la meilleure réponse. –

+0

Pour être honnête, je ne peux même pas comprendre pourquoi quelqu'un voudrait adopter cette approche avec un tableau 'char'. – Johnsyweb