web-dev-qa-db-fra.com

Comment convertir un seul caractère dans un int

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?

53
jonsb

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.

134
Binary Worrier
#define toDigit(c) (c-'0')
20
Antonius RC

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)

8
jalf

Vous pouvez utiliser la fonction atoi ()

#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[]){
    int num ;
    num = atoi(argv[1]);
    printf("\n%d", num);
}
4
arun.rajput

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 .

  1. Commencez par convertir la chaîne d'octets en chaîne unicode. (Gauche comme un exercice pour le lecteur).
  2. Ensuite, utilisez uchar.h pour regarder chaque caractère.
  3. si nous le personnage est UBool u_isdigit (UChar32 c)
  4. alors la valeur est 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.

3
Douglas Leeder
#include<iostream>
#include<stdlib>
using namespace std;

void main()
{
     char ch;
     int x;
     cin >> ch;
     x = char (ar[1]);
     cout << x;
}
2
haidernute

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;
    }
}
1
jonsb

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)

1
user54650

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'];
}
1
Ravi Singh

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.

0
KYL3R