2012-10-09 3 views
1

Je suis débutant C++. J'ai un code comme ci-dessousC++ chaîne char tableau

#include <iostream> 
#include <string> 
#include <iomanip> 

using namespace std; 
int main() 
{ 
    char sym[] = "Audi.Despo"; 
    //string sym ("Audi.Despo"); 
    string rs(sym); 
    //cout << rs << endl; 
    rs = string(sym,4); 

cout << rs; 

    return 0; 
} 

Si la sym variable est un tableau de caractères de la sortie finale de la variable de chaîne est Audi

mais si la même sym variable est une chaîne de la sortie finale est .Despo (le suffixe est imprimé)

Quelle est l'explication.

On dirait que la ligne

rs = string(sym,4); 

change son comportement si son entrée est un char [] ou une chaîne.

+3

Voir la documentation du constructeur pour 'string' sur http://fr.cppreference.com/w/cpp/string/basic_string/basic_string – hmjd

Répondre

4

C'est juste les différentes implémentations de deux des constructeur surcharges:

string (const string& str, size_t pos, size_t n = npos); 

contenu est initialisé à une copie d'une sous-chaîne de str. La sous-chaîne est la partie de str qui commence à la position de caractère pos et prend jusqu'à n caractères (il faut moins de n si la fin de str est atteinte avant).

string (const char * s, size_t n); 

contenu est initialisé à une copie de la chaîne formée par les n premiers caractères de la matrice de caractères pointée par s.

0
string (const string& str, size_t pos, size_t n = npos); 

deuxième argument dans le constructeur de std :: string est la position de départ qui est sous-chaîne utilisé pour initialiser le contenu.

0

Quand vous dites:

rs=string(sym, 4);

Ce que vous faites est dit: « me construire un objet std::string, et je (le programmeur) vous aider (le programme) faire en vous donnant cette tableau de caractères et un nombre. " Le code derrière la classe std::string sait que dans ce cas, où il est donné un tableau de caractères et un nombre entier, il doit prendre le nombre de caractères indiqué par le tableau de caractères et construire un std::string en utilisant ce contenu.

Quand vous dites:

string rs2=string(rs, 4);

Ce que vous faites maintenant est dit: « me construire un objet std::string, et je vous aider à le faire en vous donnant ce déjà existant objet std::string et un numéro." La classe std::string fait quelque chose de complètement différent dans ce cas. Quand il reçoit ces deux arguments, il utilise à la place le numéro comme pour commencer lecture à partir du std::string fourni.

Ces deux cas différents sont deux différents constructeurs pour la std::string classe - ils fournissent deux façons différentes pour construire un objet std:string basé sur les informations dont vous disposez. Vous pouvez facilement faire le deuxième travail par exemple comme le premier en changeant à ce formulaire:

string rs2=string(rs, 0, 4);

Maintenant, vous dites qu'il « initialize cette nouvelle std::string (appelée rs2) en prenant des caractères de l'autre std::stringrs. Je veux que vous commenciez au caractère à l'index 0 (ainsi, le premier) et preniez 4 caractères après cela - s'ils existent. "

Il est important de savoir, avant de construire un objet d'une classe, comment se comportent les constructeurs. Vous pouvez trouver la documentation sur tous les constructeurs std::string dans beaucoup d'endroits en ligne avec quelques recherches. Il est à noter que beaucoup d'autres choses se passent dans cet exemple (par exemple, l'opérateur d'affectation) et de nombreux problèmes sont passés en revue, mais étant donné la nature débutant auto-déclaré de cette question, j'ai senti il vaut mieux le garder haut niveau.