web-dev-qa-db-fra.com

Conversion préférée de char (pas char *) en std :: string

J'ai un char, un simple vieux caractère, que je voudrais transformer en un std::string. std::string(char) n'existe pas bien sûr. Je pourrais créer un tableau de caractères et le copier, je pourrais passer par des flux de chaînes ou de nombreux autres petits ronds-points. Actuellement, je préfère boost::lexical_cast, Mais même cela semble trop verbeux pour cette tâche simple. Alors, quel est le moyen préféré?

42
pythonic metaphor

std::string a un constructeur qui prend un nombre et un caractère. Le personnage se répétera le nombre de fois donné. Ainsi, vous devez utiliser:

std::string str(1, ch);
79
Daniel Gallagher

il suffit d'utiliser la surcharge qui prend un caractère?

c'est-à-dire string(1, 'A')

5
messenger

Pour ajouter à la réponse, vous pouvez simplement utiliser la liste d'initialisation

std::string str = {ch};
4
Gaurav Pant

Vous pouvez toujours utiliser le constructeur de chaîne en prenant deux itérateurs:

char c = 'x';
std::string(&c, &c + 1);

Mise à jour:

Bonne question James et GMan. Je viens de rechercher gratuitement "The New C Standard" par Derek M. Jones pour "pointer past" et mon premier hit était:

Si l'expression P pointe vers un élément d'un objet tableau et que l'expression Q pointe vers le dernier élément du même objet tableau, l'expression de pointeur Q + 1 est supérieure à P ... même si Q + 1 ne pointe pas vers un élément de l'objet tableau ...

Sur les architectures segmentées, l'incrémentation d'un pointeur au-delà de la fin d'un segment fait en sorte que l'adresse enroule l'architecture segmentée au début de ce segment (généralement l'adresse zéro). Si un tableau est alloué dans un tel segment, soit l'implémentation doit garantir qu'il y a de la place après le tableau pour qu'il y en ait une après l'adresse de fin, soit elle utilise une autre technique d'implémentation pour gérer ce cas (par exemple, si le segment utilisé fait partie de la représentation d'un pointeur, une valeur spéciale au-delà de la valeur du segment de fin peut être affectée) ...

Le modèle d'opérateur relationnel C permet de traiter les pointeurs vers les objets de la même manière que les index dans les objets du tableau. Les comparaisons relationnelles entre les index dans deux objets tableau différents (qui ne sont pas tous les deux des sous-objets d'un objet plus grand) ont rarement une signification et la norme ne définit pas un tel support pour les pointeurs. Certaines applications doivent utiliser des informations sur les emplacements relatifs des différents objets dans le stockage. Cependant, cet usage n'a pas été jugé suffisamment utile pour que le Comité spécifie un modèle définissant le comportement ...

La plupart des implémentations n'effectuent aucune vérification avant toute opération sur les valeurs de type pointeur. La plupart des processeurs utilisent les mêmes instructions pour effectuer des comparaisons relationnelles impliquant des types de pointeurs que pour les types arithmétiques. Pour les processeurs qui utilisent une architecture de mémoire segmentée, une valeur de pointeur est souvent représentée à l'aide de deux composants, un numéro de segment et un décalage dans ce segment. Une conséquence de cette représentation est qu'il y a de nombreux avantages à allouer du stockage pour des objets de telle sorte qu'il tienne dans un seul segment (c'est-à-dire que le stockage pour un objet ne s'étend pas sur une limite de segment). Un avantage est une optimisation impliquant le code machine généré pour certains des opérateurs relationnels, qui n'a besoin que de vérifier la composante de décalage de segment. Cela peut conduire à la situation où p> = q est faux mais p> q est vrai, lorsque p et q pointent vers des objets différents.

3
Maxim Egorushkin

Cela fonctionne sur gcc C++ 4.9.2 ( http://ideone.com/f3qhTe )

#include <iostream>
using namespace std;

int main() {
    // your code goes here
    std::string test;

    test = (char) 76;
    test += (char) 77;
    test += (char) 78;
    test += (char) 79;

    std::cout << "test contains: " << test << std::endl;
    return 0;
}
2
Sascha