2012-06-12 3 views
0

J'ai un caractère à partir du clavier, par entier:C++ caractère Append à std :: string de int

int c = getch(); 

un Je veux l'ajouter à une chaîne que si elle est pas return :

void somefunction() 
{ 
    std::string str = "you pressed: "; 
    int c; 
    while (1) 
    { 
     c = getch(); 
     if (c == 10) break; 
     char* ch; 
     sprintf(ch,"%c",c); 
     str += std::string(ch); 
    } 
} 

cependant, cela crée une erreur de segmentation lorsque le champ d'somefunction reste. Je geussing que lorsque le dtor pour str est appelé le pointeur vers ch n'est plus disponible.

Comment puis-je y remédier?

+3

Votre problème ici est que le pointeur ch n'est pas initialisé et pourrait pointer n'importe où. – sstn

+0

L'erreur de segmentation se produit parce que vous n'allouez aucune mémoire pour le tableau de caractères 'sprintf'. – jrok

+0

Votre autre problème est que vous mélangez la manipulation de chaînes de style C avec le style C++. Cela peut être fait, bien sûr, mais n'est pas nécessaire et non trivial pour obtenir raison (comme indiqué par sstn). –

Répondre

7

vous obtenez une erreur de segmentation, parce que vous essayez de sprintf chaîne dans l'inconnu (non encore attribué) mémoire:

char* ch; 
sprintf(ch,"%c",c); 

solution possible de votre code serait de remplacer char* ch; par char ch[2]; qui provoquerait ch devenir un tableau alloué statiquement avec une durée de stockage automatique. Mais notez que puisque vous programmez en C++, il serait plus sage d'utiliser des flux et des méthodes de std::string plutôt que des chaînes de style C (char*) et des fonctions de type C comme sprintf.

+0

+1. En fait, c'est une réponse complète, car elle explique la cause de la segfault. – Nawaz

13

Cela est beaucoup plus facile que vous pensez:

str.push_back(c); 
+0

Est-ce que 'str + = c;' fonctionnerait? –

+0

Ça marcherait, mais ce serait lent! – Nawaz

+3

@Nawaz Qu'est-ce qui vous fait dire ça? –