Char non si sta convertendo in int

Per qualche ragione il mio programma C si rifiuta di convertire elementi di argv in intarsi, e non riesco a capire perché.

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’output durante l’esecuzione ./test 50:

50

-1.076,276207 millions

Ho provato a rimuovere il (int), lanciando sia un * e 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?

argv[1] è un char * non un char che non puoi convertire un char * in 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 #include 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 l’ho eseguito in questo modo

 ./testargv 1243 

e ottenuto

 1243 1 

Prova a usare atoi(argv[1]) (“ascii in int”).

Stai solo provando a convertire un char* in int, il che ovviamente non ha molto senso. Probabilmente hai 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 tuo char* con ‘\ 0’, che dovrebbe, ma probabilmente non deve fare.

(type) esiste per lanciare tipi – per cambiare 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] punta al primo carattere. Controlla qui per una rapida spiegazione dei puntatori in C. Quindi la tua “stringa” è rappresentata in memoria come:

 ['5']['0'] 

quando lanci

 int i = (int) *argv[1] 

stai solo trasmettendo il primo elemento a un int, quindi perché tu

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