2012-03-17 3 views
18

i ont un morceau de code comme ceci:Comment puis-je obtenir argv [] comme int?

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

et shell je fais ceci:

./test 7

mais le premier résultat de printf n'est pas 7, comment puis-je argv [] un saint? Un grand merci

+3

Je sais que cnicutar a déjà donné la réponse, mais cela aide à comprendre ce qui se passe. Savez-vous ce que argv [1] est exactement? Je veux dire, pouvez-vous expliquer pourquoi vous obtenez la sortie que vous obtenez? –

+0

À mon avis, argv [0] est la commande elle-même et argv [1] est le premier paramètre I d'entrée. Dans ce cas est 7. – Michael

+0

Oui, c'est vrai, mais qu'est-ce que c'est? Quel genre? Que pouvez-vous faire avec? Pourquoi obtenez-vous la sortie que vous obtenez dans l'exemple ci-dessus? Pouvez-vous faire l'addition ou la multiplication avec lui, et si l'utilisateur ne tape pas un nombre, mais './test seven' ou quelque chose? –

Répondre

23

argv[1] est un pointeur sur une chaîne.

Vous pouvez l'imprimer en utilisant: printf("%s\n", argv[1]);

Pour obtenir un nombre entier d'une chaîne que vous devez d'abord le convertir. Utilisez strtol pour convertir une chaîne en 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

Merci beaucoup.J'utilise la fonction strtol et sa construction a réussi mais j'ai un problème EXC_BAD_ACCESS, je pense que c'est parce que argv [1] n'existe pas lors de la construction du projet. – Michael

+0

Que signifie le 10 dans la fonction strtol? –

+4

@AlejandroSazo c'est la base de la conversion, donc ici la conversion est faite en base '10'. – ouah

12

Vous pouvez utiliser strtol pour que:

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

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

Sinon, si vous utilisez C99 ou mieux vous pourriez explorer strtoimax.

+0

Merci pour votre réponse, c'est très utile. – Michael

6

La fonction "string to long" (strtol) est standard pour cela. Utilisation de base:

#include <stdlib.h> 

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

Puisque nous utilisons le système décimal, la base est 10. L'argument endptr sera réglé sur le « premier caractère invalide », à savoir le premier non chiffres. Si cela ne vous intéresse pas, définissez l'argument sur NULL au lieu de transmettre un pointeur. Si vous ne voulez pas non chiffres à se produire, vous pouvez vous assurer qu'il est réglé sur la « terminaison null » (une \0 termine une chaîne 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 

Comme le man page mentionne, vous pouvez utiliser errno à vérifiez qu'aucune erreur ne s'est produite (dans ce cas, débordements ou sous-flux).

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

Au-delà de cela, vous pouvez mettre en œuvre des contrôles personnalisés: tester si l'utilisateur a passé un argument du tout; tester si le nombre est dans les plages autorisées;

+0

Mieux expliqué que la réponse acceptée. Au moins, pour les débutants comme moi. – Dinei

3

Vous pouvez utiliser la fonction int atoi (const char * str);.
Vous devez inclure #include <stdlib.h> et utiliser la fonction de cette façon:
int x = atoi(argv[1]);
Voici plus d'informations si nécessaire: 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); 

} 

Hope this helps. Bonne chance!