Domanda

Ho una serie di cifre, ad es. "123456789" e ho bisogno di estrarre ciascuno di essi per usarli in un calcolo. Ovviamente posso accedere a ciascun carattere per indice, ma come posso convertirlo in un int?

Ho esaminato atoi (), ma ci vuole una stringa come argomento. Quindi devo convertire ogni carattere in una stringa e quindi chiamare atoi su di esso. C'è un modo migliore?

È stato utile?

Soluzione

È possibile utilizzare il fatto che le codifiche dei caratteri per le cifre sono tutte nell'ordine da 48 (per '0') a 57 (per '9'). Questo vale per ASCII, UTF-x e praticamente tutte le altre codifiche ( vedere i commenti di seguito per ulteriori informazioni su questo ).

Pertanto il valore intero per qualsiasi cifra è la cifra meno '0' (o 48).

char c = '1';
int i = c - '0'; // i is now equal to 1, not '1'

è sinonimo di

char c = '1';
int i = c - 48; // i is now equal to 1, not '1'

Comunque trovo il primo c - '0' molto più leggibile.

Altri suggerimenti

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

Oppure puoi utilizzare il " corretto " metodo, simile al tuo approccio originale atoi, ma con invece std :: stringstream. Ciò dovrebbe funzionare con caratteri sia come input che come stringhe. (boost :: lexical_cast è un'altra opzione per una sintassi più conveniente)

(atoi è una vecchia funzione C, ed è generalmente raccomandato di usare gli equivalenti C ++ più flessibili e dattili ove possibile. std :: stringstream copre la conversione da e verso le stringhe)

Puoi usare la funzione atoi ()

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

Le risposte fornite sono ottime fintanto che si desidera gestire solo numeri arabi e funzionano in una codifica in cui tali numeri sono sequenziali e nello stesso posto di ASCII.

Questo è quasi sempre il caso.

In caso contrario, hai bisogno di una libreria adeguata per aiutarti.

Cominciamo con ICU .

  1. Innanzitutto converti la stringa di byte in una stringa unicode. (Lasciato come esercizio per il lettore).
  2. Quindi usa uchar.h per guardare ogni personaggio.
  3. se il personaggio è UBool u_isdigit (UChar32 c)
  4. quindi il valore è int32_t u_charDigitValue (UChar32 c)

O forse l'ICU ha qualche funzione per farlo per te - non l'ho esaminato in dettaglio.

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

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

Se sei preoccupato per la codifica, puoi sempre usare un'istruzione switch.

Fai solo attenzione al formato in cui tieni quei numeri grandi. La dimensione massima per un numero intero in alcuni sistemi è di soli 65.535 (32.767 firmati). Altri sistemi, hai 2.147.483.647 (o 4.294.967.295 senza segno)

Problemi con il seguente modo di farlo?

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

In questo modo puoi convertire facilmente char in int e int in char:

int charToInt(char c)
{
   int arr[]={0,1,2,3,4,5,6,7,8,9};
   return arr[c-'0'];
}

Per me ha funzionato abbastanza bene:

QChar c = '5';
int x = c.digitValue();
// x is now 5

Documentazione: int QChar :: digitValue () const che dice:

  

Restituisce il valore numerico della cifra o -1 se il carattere non lo è   una cifra.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top