2012-03-17 30 views
18

Tengo un pedazo de código como este:¿Cómo puedo obtener argv [] como int?

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

y con cáscara hago esto:

./test 7

pero el primer resultado printf no es 7, ¿cómo puedo obtener argv [] ¿un santo? muchas gracias

+3

Sé que cnicutar ya dio la respuesta, pero ayuda a comprender lo que está sucediendo. ¿Sabes qué argv [1] es exactamente? Quiero decir, ¿puedes explicar por qué obtienes la producción que obtienes? –

+0

En mi opinión, argv [0] es el comando en sí y argv [1] es el primer parámetro que ingreso. En este caso es 7. – Michael

+0

Sí, es correcto, pero ¿qué es? ¿Que tipo? ¿Qué puedes hacer con eso? ¿Por qué obtienes el resultado que obtienes en el ejemplo anterior? ¿Puedes hacer una adición o multiplicación con él, y qué sucede si el usuario no escribe un número, sino './test seven' o algo así? –

Respuesta

23

argv[1] es un puntero a una cadena.

Puede imprimirlo usando: printf("%s\n", argv[1]);

Para obtener un número entero de una cadena que tiene primero para convertirlo. Use strtol para convertir una cadena a int.

#include <errno.h> // for errno 
#include <limits.h> // for INT_MAX 
#include <stdlib.h> // for strtol 

char *p; 
int num; 

errno = 0; 
long conv = strtol(argv[1], &p, 10); 

// Check for errors: e.g., the string does not represent an integer 
// or the integer is larger than int 
if (errno != 0 || *p != '\0' || conv > INT_MAX) { 
    // Put here the handling of the error, like exiting the program with 
    // an error message 
} else { 
    // No error 
    num = conv;  
    printf("%d\n", num); 
} 
+0

Muchas gracias.Utilizo la función de strtol y su compilación tuvo éxito pero recibí un problema de EXC_BAD_ACCESS, creo que es porque argv [1] no existe cuando se construye el proyecto. – Michael

+0

¿Qué significa el 10 en la función strtol? –

+4

@AlejandroSazo es la base de la conversión, por lo que aquí la conversión se realiza en base '10'. – ouah

12

Puede utilizar strtol para ello:

long x; 
if (argc < 2) 
    /* handle error */ 

x = strtol(argv[1], NULL, 10); 

Alternativamente, si usted está utilizando C99 o mejor que podrían explorar strtoimax.

+0

Gracias por su respuesta, es muy útil. – Michael

6

La "cadena larga a la" función (strtol) es estándar para esto. El uso básico:

#include <stdlib.h> 

int arg = strtol(argv[1], NULL, 10); 
// string to long(string, endptr, base) 

Debido a que utilizamos el sistema decimal, la base es 10. El argumento endptr se establecerá en el "primer carácter no válido", es decir, el primer no-dígitos. Si no le importa, establezca el argumento en NULL en lugar de pasar un puntero. Si no desea que los no-dígitos que se produzca, puede asegurarse de que está establecido en el "terminador nulo" (un \0 termina cadenas en C):

#include <stdlib.h> 

char* p; 
int arg = strtol(argv[1], &p, 10); 
if (*p != '\0') // an invalid character was found before the end of the string 

A medida que el man page menciones, puede utilizar errno a compruebe que no haya errores (en este caso, desbordamientos o subdesbordamientos).

#include <stdlib.h> 
#include <errno.h> 

char* p; 
errno = 0; 
int arg = strtol(argv[1], &p, 10); 
if (*p != '\0' || errno != 0) return 1; 

// Everything went well 
printf("%d", arg); 

Además, puede implementar comprobaciones personalizadas: comprobar si el usuario pasó un argumento; probar si el número está en rangos permitidos; etc.

+0

Mejor explicado que la respuesta aceptada. Al menos, para principiantes como yo. – Dinei

3

Puede usar la función int atoi (const char * str);.
Es necesario incluir #include <stdlib.h> y utilizar la función de esta manera:
int x = atoi(argv[1]);
Aquí más información si es necesario: atoi - C++ Reference

0
/* 

    Input from command line using atoi, and strtol 
*/ 

#include <stdio.h>//printf, scanf 
#include <stdlib.h>//atoi, strtol 

//strtol - converts a string to a long int 
//atoi - converts string to an int 

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

    char *p;//used in strtol 
    int i;//used in for loop 

    long int longN = strtol(argv[1],&p, 10); 
    printf("longN = %ld\n",longN); 

    //cast (int) to strtol 
    int N = (int) strtol(argv[1],&p, 10); 
    printf("N = %d\n",N); 

    int atoiN; 
    for(i = 0; i < argc; i++) 
    { 
     //set atoiN equal to the users number in the command line 
     //The C library function int atoi(const char *str) converts the string argument str to an integer (type int). 
     atoiN = atoi(argv[i]); 
    } 

    printf("atoiN = %d\n",atoiN); 
    //-----------------------------------------------------// 
    //Get string input from command line 
    char * charN; 

    for(i = 0; i < argc; i++) 
    { 
     charN = argv[i]; 
    } 

    printf("charN = %s\n", charN); 

} 

Espero que esto ayude. ¡Buena suerte!