Convertir une chaîne en un tableau d'entiers?
Je suis un débutant en C++ et ne peut pas comprendre cela. Tout simplement que la question dit, si j'ai une chaîne de caractères (un certain nombre), comment puis-je convertir chacun des chiffres d'un entier et de les mettre chacun dans un tableau d'entiers?
C'était ma tentative:
std::string stringNumber = "123456789"; //this number will be very large
int intNumber[stringNumber.length()];
for (int i = 0; i < stringNumber.length(); i++)
{
intNumber[i] = std::atoi(stringNumber[i]);
std::cout << intNumber[i] << std::endl;
}
std::atoi()
prend un pointeur vers C-string et convertit la totalité de la séquence en un entier. Ce que vous voulez est de convertir chaque chiffre dans un int
. Vous pouvez calculer le int
valeur d'un chiffre d
à l'aide de d - '0'
.Notez qu'en C++, vous pas l'utilisation
int intNumber[stringNumber.length()]
! C++ ne prend pas en charge longueur variable tableaux. Si vous souhaitez utiliser un tableau de taille variable en C++, vous pouvez utiliser std::vector<int> intNumber(stringNumber.length());
.Affirment, en outre, chaque caractère d'entrée est à l'intérieur ['0'..'9']. L'expression 'a' - '0', par exemple, est parfaitement valide, et plus certainement pas ce que vous voulez. Valider la chaîne d'entrée tout en marchant, il pour assurer les caractères sont, en fait, des chiffres.
OriginalL'auteur AaronAAA | 2012-12-22
Vous devez vous connecter pour publier un commentaire.
Pour la plupart prêts à l'emploi solution, je voudrais utiliser un vecteur et
std::transform
. L'idée est d'aller à travers chaque personnage et ajouter la forme entière de l'informatique pour le vecteur: (voir la totalité de l'échantillon)Ce que ce n'est en boucle depuis le début de la chaîne à la fin, prendre chaque personnage, et ajouter de la valeur moins
'0'
('5' - '0'
serait de 5) à la fin de la vector, vous laissant avec un vecteur d'entier équivalents. Le meilleur de tous, il ne cherche pas à réinventer la roue!Il résout également les deux problèmes que vous avez:
Il utilise
std::vector
au lieu d'une longueur variable array (VLA). Ce dernier est non standard, c'est plutôt un vecteur si vous avez besoin d'un moteur d'exécution tableau de taille.Vous utilisez
atoi
, ce qui est mauvais en soi, car elle renvoie 0 en cas d'erreur, ne laissant aucune certitude de savoir si le résultat est 0 ou s'il y a une erreur. Il prend également une chaîne de caractères, pas un seul caractère. Au lieu de cela ce trouve la distance entre'0'
et le caractère, qui est le nombre entier nous avons besoin.Pour une couche supplémentaire de sécurité, vous pouvez utiliser
isdigit
de vérifier si le caractère est un chiffre. Si non, posent une erreur de quelque sorte (comme une exception), ou traiter de quelque autre façon que vous. Cela garantit que les chiffres sont dans votreints
vecteur sera de 0 à 9 et vous ne finirez pas avec un chiffre d', disons, 25.ints.reserve(s.size())
avant la transformation serait une bonne idée.Bon point, je vais ajouter que dans.
C'est plus une perte de l'entreprise de programmation de temps qu'autre chose. Généralement (mais il peut ne pas être le cas avec toutes les implémentations), si ce code s'est avéré être un mesurables goulot de bouteille, de la création de vecteur avec
std::vector<int> ints( s.size() );
et à l'aide deints.begin()
, plutôt que d'un itérateur d'insertion, sera plus rapide. Mais il serait stupide de faire ça ou de la réserve jusqu'à ce que vous savez que c'est un point de blocage.Et bien sûr: 1) cela ne fonctionne qu'avec C++11, ce n'est pas une option pour la plupart des gens, et 2) sans vérifier
isdigit
, le code a un comportement indéfini (et 3) si vous appelezisdigit(c)
dans le lambda, le code a un comportement indéfini.Tous les points valides. Il peut être fait de travailler pour le C++03 assez facilement, en utilisant une fonction au lieu d'une lambda. En gardant le C++11, le deuxième est assez facile à corriger et a une note. Cela dit, le tiers est également facile à fixer, par l'ajout d'une explicite le type de retour de la lambda.
OriginalL'auteur chris
Vous n'avez pas besoin atoi(). Utilisation
intNumber[i] = stringNumber[i] - '0';
Le "-" de l'opérateur sur
char
type retourne la distance entre les personnages. Puisque la Distance à partir de char '3' pour le caractère '0' est 3 c'est truc commun à utiliser pour convertir char en entier.Il prend le caractère actuel, qui pourrait être
'4'
,'1'
,'8'
, etc., et soustrait'0'
. Depuis, les chiffres sont garantis pour avoir des codes de caractères, il donnera la valeur de l'entier de ce que le caractère est affiché en.OriginalL'auteur Pavel Radzivilovsky