2012-03-19 10 views
10

Per qualche ragione il mio programma C si rifiuta di convertire elementi di argv in interi, e non riesco a capire perché.Il char non sta convertendo in int

int main(int argc, char *argv[]) 
{ 

    fprintf(stdout, "%s\n", argv[1]); 

    //Make conversions to int 
    int bufferquesize = (int)argv[1] - '0'; 

    fprintf(stdout, "%d\n", bufferquesize); 
} 

E questo è l'uscita quando si esegue ./test 50:

-1076276207

Ho provato a rimuovere la (int), gettando sia a * un & tra (int) e argv [1] - il primo mi ha dato un 5 ma non 50, ma quest'ultimo mi ha dato un risultato simile a quello sopra. Rimozione dell'operazione - '0' non aiuta molto. Ho anche provato a fare un char first = argv [1] e usare prima la conversione invece, e questo abbastanza stranamente mi ha dato un 17 indipendentemente dall'input.

Sono estremamente confuso. Cosa sta succedendo?

+0

Penso che potresti voler dire 'argv [1] [0]' (type is 'char') <- primo carattere del primo argomento (dopo il nome exec). Certo, non ci sono ancora controlli e ci sono modi migliori.Non provare a "scartare un errore" (come 'argv [1]' è digitato come 'char *') perché spesso non funziona :-) –

risposta

12

argv[1] è un non char * un char non è possibile convertire un char * a un int. Se vuoi cambiare il primo carattere in argv [1] in un int che puoi fare.

int i = (int)(argv[1][0] - '0'); 

Ho appena scritto questo

#include<stdio.h> 
#include<stdlib.h> 

int main(int argc, char **argv) { 
    printf("%s\n", argv[1]); 

    int i = (int)(argv[1][0] - '0'); 

    printf("%d\n", i); 
    return 0; 
} 

e corse in questo modo

./testargv 1243 

e ottenuto

1243 
1 
+0

Hai lasciato il tuo riferimento ad atoi ... perché? – FrankieTheKneeMan

+0

@FrankieTheKneeMan Non stavo mai usando atoi. potresti usarlo se vuoi ma la mia risposta non l'ha mai avuto. La risposta di Scott Hunter lo usa però. – twain249

+0

Huh. Indovina che ho letto male. – FrankieTheKneeMan

52

Provare a utilizzare atoi(argv[1]) ("da ascii a int").

+10

Questa dovrebbe essere la risposta selezionata. – RyanB

+1

Questo qui. la funzione atoi() è stata creata per questo. –

3

si sta solo cercando di convertire un char* a int, che ovviamente non ha molto senso. Probabilmente bisogno di farlo come:

int bufferquesize = 0; 
for (int i = 0; argv[1][i] != '\0'; ++i) { 
    bufferquesize *= 10; bufferquesize += argv[1][i] - '0'; 
} 

Ciò presuppone, tuttavia, che il vostro char* termina con '\ 0', che dovrebbe, ma probabilmente non hanno a che fare.

+1

In realtà assume la matrice di 'char's * che il tuo' char * 'punta su * termina con' '\ 0''. Se il puntatore "termina in' '\ 0'' (cosa significherebbe comunque che la sua rappresentazione finisce in un byte 0?) Non è un problema –

+0

Di, naturalmente, la frase "un puntatore a' char' termina con un certo simbolo "non ha senso, grazie per la correzione :) –

2

(tipo) esiste per trasmettere tipi: per modificare il modo in cui un programma sembra un pezzo di memoria. Nello specifico, legge la codifica in byte del carattere '5' e la trasferisce in memoria. Un char * è una matrice di caratteri, mentre i caratteri sono numeri interi senza segno di un byte. argv[1] punti al primo carattere. Controllare here per una rapida spiegazione di puntatori in C. Così il vostro "stringa" è rappresentato in memoria come:

['5']['0'] 

quando lanci

int i = (int) *argv[1] 

si sta solo gettando il primo elemento ad un int , quindi perché

La funzione che stai cercando è o atoi() come menzionato da Scott Hunter, o strtol(), che preferisco a causa del suo comportamento di rilevamento degli errori.

Problemi correlati