2012-03-19 25 views
10

Por alguna razón, mi programa C se niega a convertir elementos de argv en ints, y no puedo entender por qué.Char no está convirtiendo a 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); 
} 

Y esta es la salida cuando se ejecuta ./test 50:

-1076276207

he intentado quitar la (int), tirando tanto a * y un & entre (int) y argv [1] - el primero me dio un 5 pero no 50, pero el último me dio un resultado similar al anterior. Eliminar la operación '0' no ayuda mucho. También intenté hacer un char first = argv [1] y usar primero para la conversión, y esto me dio un 17 bastante extraño independientemente de la entrada.

Estoy muy confundido. Que esta pasando?

+0

Creo que podría querer decir 'argv [1] [0]' (tipo es 'char') <- primer carácter del primer argumento (después del nombre del ejecutivo). Por supuesto, todavía no hay verificación con eso y hay mejores formas.No intente "descartar un error" (ya que 'argv [1]' se escribe como 'char *') porque a menudo simplemente no funciona :-) –

Respuesta

12

argv[1] no es un char * un char no se puede convertir un char * a un int. Si desea cambiar el primer carácter en argv [1] a un int, puede hacerlo.

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

acaba de escribir este

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

y corrieron como este

./testargv 1243 

y tiene

1243 
1 
+0

Ha cancelado su referencia a atoi ... ¿por qué? – FrankieTheKneeMan

+0

@FrankieTheKneeMan Nunca he usado atoi. podrías usarlo si quieres pero mi respuesta nunca lo tuvo. La respuesta de Scott Hunter lo usa sin embargo. – twain249

+0

Huh. Supongo que malinterpreté. – FrankieTheKneeMan

52

Intente usar atoi(argv[1]) ("ascii to int").

+10

Esta debería ser la respuesta seleccionada. – RyanB

+1

Esto aquí mismo. La función atoi() se creó para esto. –

3

Usted está tratando de convertir un char* a INT, que por supuesto no tiene mucho sentido. Es probable que tenga que hacerlo así:

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

Esto supone, sin embargo, que su char* termina con '\ 0', lo que debería, pero probablemente no tiene que hacer.

+1

En realidad, asume que la matriz de 'char's * que su' char * 'apunta a * termina con' '\ 0''. Si el puntero "termina en' '\ 0'' (¿qué significa eso de todos modos? ¿Que su representación termina en un byte 0?) No es un problema. –

+0

Of, course. La oración "a pointer to' char' termina con un cierto símbolo "simplemente no tiene sentido. Gracias por la corrección. :) –

2

(tipo) existe para lanzar tipos: para cambiar la forma en que un programa se ve como una pieza de memoria. Específicamente, lee la codificación de bytes del carácter '5' y lo transfiere a la memoria. Un char * es una matriz de caracteres, y los caracteres son enteros sin signo de un byte. argv[1] apunta al primer personaje. Compruebe here para una explicación rápida de punteros en C. Por lo que su "cadena" se representa en la memoria como:

['5']['0'] 

cuando lanzas

int i = (int) *argv[1] 

que sólo está lanzando el primer elemento a un int , por lo que

La función que está buscando es atoi() mencionada por Scott Hunter, o strtol(), que prefiero debido a su comportamiento de detección de errores.