Le seul moyen que je connaisse est:
#include <sstream>
#include <string.h>
using namespace std;
int main() {
int number=33;
stringstream strs;
strs << number;
string temp_str = strs.str();
char* char_type = (char*) temp_str.c_str();
}
Mais existe-t-il une méthode avec moins de frappe?
c++
integer
const-char
rsk82
la source
la source
Réponses:
Dans C ++ 17, utilisez
std::to_chars
comme:Dans C ++ 11, utilisez
std::to_string
comme:Et en C ++ 03, ce que vous faites est très bien, sauf à utiliser
const
comme:la source
std::string
par défaut au lieu dechar*
.std::string
est disponible par défaut, à moins qu'il ne soit explicitement spécifié dans la question elle-même. Logique? De plus, puisque la question elle-même utilisestd::string
(etstd::stringstream
), vous n'avez pas beaucoup de raisons d'être en désaccord avec elle.Je pense que vous pouvez utiliser un sprintf:
la source
-2147483647
.(((sizeof number) * CHAR_BIT) + 2)/3 + 2
ressemble à de la magie ...Vous pouvez utiliser boost
la source
Une solution de style C pourrait être à utiliser
itoa
, mais le meilleur moyen est d'imprimer ce nombre dans une chaîne en utilisantsprintf
/snprintf
. Vérifiez cette question: Comment convertir un entier en chaîne de manière portative?Notez que la
itoa
fonction n'est pas définie dans ANSI-C et ne fait pas partie de C ++, mais est prise en charge par certains compilateurs. C'est une fonction non standard, vous devriez donc éviter de l'utiliser. Vérifiez également cette question: Alternative à itoa () pour convertir un entier en chaîne C ++?Notez également que l'écriture de code de style C pendant la programmation en C ++ est considérée comme une mauvaise pratique et parfois appelée "style horrible". Voulez-vous vraiment le convertir en
char*
chaîne de style C ? :)la source
Je ne taperais pas le const dans la dernière ligne car il est là pour une raison. Si vous ne pouvez pas vivre avec un char const *, vous feriez mieux de copier le tableau char comme:
la source
const char* char_type = temp_str.c_str();
c'est mieux?std::vector<char> temp_vec(temp_str.begin(), temp_str.end()); temp_vec.push_back(0); char *char_type = &vec[0];
. Cela vous donne une mémoire modifiable, bien que vous deviez bien sûr garder le vecteur en vie aussi longtemps que vous souhaitez utiliser le pointeur.string
et ne vous embêtez pas avec de vieux, simples, stupideschar *
de vieux, simples C. <bits de flamme prévus>char*
, et non "y a-t-il un intérêt à appeler de C ++ dans des bibliothèques existantes écrites en C, ou dois-je les réimplémenter en C ++?" ;-pTrès bien .. d'abord j'avais besoin de quelque chose qui fasse ce que cette question demande, mais j'en avais besoin RAPIDEMENT! Malheureusement, la "meilleure" façon est de près de 600 lignes de code !!! Pardonnez-lui le nom qui n'a rien à voir avec ce qu'il fait. Le nom propre était Integer64ToCharArray (valeur int64_t);
https://github.com/JeremyDX/All-Language-Testing-Code/blob/master/C%2B%2B%20Examples/IntegerToCharArrayTesting.cpp
N'hésitez pas à essayer de nettoyer ce code sans nuire aux performances.
Entrée: toute valeur 64 bits signée de la plage minimale à la plage maximale.
Exemple:
Production:
Tests de vitesse d'origine: ( Integer64ToCharArray (); )
Meilleur cas, valeur à 1 chiffre.
Dans le pire des cas, valeur à 20 chiffres.
Nouveaux tests de vitesse de conception: ( AddDynamicallyToBuffer (); )
Meilleur cas, valeur à 1 chiffre.
Pire cas 32 bits - Valeur à 11 chiffres.
Pire cas négatif de 1 billion de dollars - Valeur à 14 chiffres.
Cas pire de 64 bits - Valeur de 20 chiffres.
Comment ça fonctionne!
Nous effectuons une technique Divide and Conquer et une fois que nous avons maintenant la longueur maximale de la chaîne, nous définissons simplement chaque valeur de caractère individuellement. Comme indiqué dans les tests de vitesse ci-dessus, les plus grandes longueurs entraînent de lourdes pénalités de performances, mais c'est toujours beaucoup plus rapide que la méthode de boucle d'origine et aucun code n'a réellement changé entre les deux méthodes, à part la boucle n'est plus utilisée.
Dans mon utilisation, d'où le nom, je renvoie le décalage à la place et je ne modifie pas un tampon de tableaux de caractères plutôt que je commence à mettre à jour les données de sommet et la fonction a un paramètre supplémentaire pour le décalage afin qu'il ne soit pas initialisé à -1.
la source
Voir cette réponse https://stackoverflow.com/a/23010605/2760919
Pour votre cas, changez simplement le type dans snprintf de long ("% ld") à int ("% n").
la source
C'est peut-être un peu tard, mais j'ai aussi eu le même problème. La conversion en char a été traitée en C ++ 17 avec la bibliothèque "charconv".
https://en.cppreference.com/w/cpp/utility/to_chars
la source
Vous pouvez également utiliser la diffusion.
exemple:
la source