J'ai une chaîne de chiffres, par exemple "123456789", et je dois extraire chacun d'eux pour les utiliser dans un calcul. Je peux bien sûr accéder à chaque caractère par index, mais comment puis-je le convertir en int?
J'ai examiné atoi (), mais il faut une chaîne comme argument. Par conséquent, je dois convertir chaque caractère en chaîne, puis appeler atoi dessus. Y a-t-il un meilleur moyen?
Vous pouvez utiliser le fait que les codages de caractères des chiffres sont tous dans l'ordre de 48 (pour "0") à 57 (pour "9"). Cela est vrai pour ASCII, UTF-x et pratiquement tous les autres encodages ( voir les commentaires ci-dessous pour plus d'informations à ce sujet ).
Par conséquent, la valeur entière pour tout chiffre est le chiffre moins '0' (ou 48).
char c = '1';
int i = c - '0'; // i is now equal to 1, not '1'
est synonyme de
char c = '1';
int i = c - 48; // i is now equal to 1, not '1'
Cependant, je trouve que le premier c - '0'
est beaucoup plus lisible.
#define toDigit(c) (c-'0')
Ou vous pouvez utiliser la méthode "correcte", similaire à votre approche atoi originale, mais avec std :: stringstream à la place. Cela devrait fonctionner avec les caractères en entrée et les chaînes. (boost :: lexical_cast est une autre option pour une syntaxe plus pratique)
(atoi est une ancienne fonction C, et il est généralement recommandé d'utiliser les équivalents C++ les plus flexibles et les plus sécurisés. Si possible, std :: stringstream couvre la conversion en chaînes)
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[]){
int num ;
num = atoi(argv[1]);
printf("\n%d", num);
}
Les réponses fournies sont excellentes tant que vous ne voulez gérer que des chiffres arabes et que vous travaillez dans un codage où ces chiffres sont séquentiels et au même endroit que ASCII.
C'est presque toujours le cas.
Si ce n'est pas le cas, vous avez besoin d'une bibliothèque appropriée pour vous aider.
Commençons par ICU .
UBool u_isdigit (UChar32 c)
int32_t u_charDigitValue ( UChar32 c )
Ou peut-être que ICU a une fonction pour le faire pour vous - je ne l'ai pas regardée en détail.
#include<iostream>
#include<stdlib>
using namespace std;
void main()
{
char ch;
int x;
cin >> ch;
x = char (ar[1]);
cout << x;
}
Des problèmes avec la manière suivante de le faire?
int CharToInt(const char c)
{
switch (c)
{
case '0':
return 0;
case '1':
return 1;
case '2':
return 2;
case '3':
return 3;
case '4':
return 4;
case '5':
return 5;
case '6':
return 6;
case '7':
return 7;
case '8':
return 8;
case '9':
return 9;
default:
return 0;
}
}
Si vous êtes inquiet à propos de l'encodage, vous pouvez toujours utiliser une instruction switch.
Faites attention au format dans lequel vous conservez ces grands nombres. Dans certains systèmes, la taille maximale d'un nombre entier est de 65 535 (32 767 signés). Autres systèmes, vous avez 2 147 483 647 (ou 4 294 967 295 non signés)
De cette façon, vous pouvez convertir char en int et int en char facilement:
int charToInt(char c)
{
int arr[]={0,1,2,3,4,5,6,7,8,9};
return arr[c-'0'];
}
Pour moi ce qui suit a plutôt bien fonctionné:
QChar c = '5';
int x = c.digitValue();
// x is now 5
Documentation: int QChar :: digitValue () const qui dit:
Retourne la valeur numérique du chiffre, ou -1 si le caractère n'est pas un chiffre.