Question

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?

Était-ce utile?

La solution

Vous pouvez utiliser le fait que les codages de caractères des chiffres sont tous dans l’ordre allant 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 ).

Par conséquent, la valeur entière pour tout chiffre correspond au 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 le premier c - '0' beaucoup plus lisible.

Autres conseils

#define toDigit(c) (c-'0')

Ou vous pouvez utiliser le "correct" méthode, similaire à votre approche atoi originale, mais avec std :: stringstream à la place. Cela devrait fonctionner avec les caractères en entrée ainsi que 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 autant que possible les équivalents C ++ les plus flexibles et les plus sécurisés. std :: stringstream couvre la conversion en et à partir de chaînes)

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);
}

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 qu'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. Convertissez d'abord la chaîne d'octets en chaîne unicode. (À gauche comme exercice pour le lecteur).
  2. Utilisez ensuite uchar.h pour examiner chaque caractère.
  3. si nous le caractère est UBool u_isdigit (UChar32 c)
  4. alors la valeur est int32_t u_charDigitValue (UChar32 c)

Ou peut-être qu'ICU a une fonction pour le faire pour vous - je ne l'ai pas regardé en détail.

#include<iostream>
#include<stdlib>
using namespace std;

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

Si vous craignez que vous souhaitiez encoder, 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 aussi faible que 65 535 (32 767 signés). Autres systèmes, vous avez 2 147 483 647 (ou 4 294 967 295 non signés)

Des problèmes avec la façon 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;
    }
}

De cette manière, 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, les éléments suivants ont très 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top