2009-11-26 17 views
8

Come posso convertire char a [0] in int b [0] dove b è un array int allocato dinamicamente vuotoConvertire singolo char a int

Ho provato

char a[] = "4x^0"; 
int *b; 
b = new int[10]; 
char temp = a[0]; 
int temp2 = temp - 0; 
b[0] = temp2; 

voglio 4 ma mi dà valore ASCII 52

facendo anche

a[0] = aoti(temp); 

mi dà errore: co non valida nVersione da ‘char’ a ‘const char *’ inizializzazione argomento 1 di ‘int atoi (const char *)’

+0

noti che atoi non funziona perché atoi prende in una stringa e non in un singolo carattere - per la buona ragione che molti numeri hanno più di una cifra! –

risposta

24

Hai bisogno di fare:

int temp2 = temp - '0'; 

invece.

+0

Dal punto di vista della lingua avvocato mi immagino che non è valida per ritenere che le cifre sono sequenziali, quindi questo potrebbe non essere portatile al 100% - anche se funziona sia in ASCII (e le sue estensioni) e EBCDIC, quindi in pratica è bene. –

+13

Sorprendentemente, è perfetto anche per un avvocato linguistico - ISO C90 contiene il seguente requisito poco appariscente: "In entrambi i set di caratteri di base di origine ed esecuzione, il valore di ogni carattere dopo 0 nell'elenco precedente di cifre decimali deve essere uno maggiore rispetto al valore del precedente ". –

+0

Molto buono, @Pavel. C'è molto codice scritto supponendo che gli alfa siano anche contigui, il che rende un PITA reale il porting al sottosistema UNIX del mainframe (USS, che usa EBCDIC, da non confondere con zLinux che usa ASCII). A parte il set di caratteri minimi piuttosto limitato e la natura contigua dei caratteri numerici, ISO C in realtà non richiede molto in quell'area. – paxdiablo

1

L'atoi() versione non funziona perché atoi() opera su stringhe, non i singoli caratteri. Quindi questo dovrebbe funzionare:

char a[] = "4"; 
b[0] = atoi(a); 

Si noti che si può essere tentati di fare: atoi (& temp) ma questo non avrebbe funzionato, come & temperatura non punta a una stringa terminata da null.

0

è possibile sostituire l'intera sequenza:

char a[] = "4x^0"; 
int *b; 
b = new int[10]; 
char temp = a[0]; 
int temp2 = temp - 0; 
b[0] = temp2; 

con la più semplice:

char a[] = "4x^0"; 
int b = new int[10]; 
b[0] = a[0] - '0'; 

Non c'è bisogno a tutti di pasticciare con le variabili temporanee. Il motivo è necessario utilizzare '0' invece di 0 è perché il primo è il carattere '0' che ha un valore di 48, piuttosto che il valore 0.