2010-12-01 26 views
2

Je suis sur un Mac OS X 10.6.5 en utilisant XCode 3.2.1 64 bits pour construire un outil de ligne de commande C avec une configuration de construction de 10.6 | Déboguer | x86_64. Je veux passer un entier pair positif comme argument, donc je lance l'indice 1 de argv en int. Cela semble fonctionner, sauf qu'il semble que mon programme obtienne la valeur ASCII au lieu de lire l'ensemble du tableau char et de convertir en une valeur int. Quand j'entre 'progname 10', il me dit que j'ai entré 49, ce qui est aussi ce que j'obtiens quand j'appelle 'progname 1'. Comment puis-je obtenir C pour lire l'ensemble du tableau char comme une valeur int? Google m'a seulement montré (int) * charPointer, mais clairement cela ne fonctionne pas.Comment lancer l'argument du programme * char comme int correctement?

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

int main(int argc, char **argv) { 
    char *programName = getProgramName(argv[0]); // gets the name of itself as the executable 
    if (argc < 2) { 
     showUsage(programName); 
     return 0; 
    } 
    int theNumber = (int)*argv[1]; 
    printf("Entered [%d]", theNumber);   // entering 10 or 1 outputs [49], entering 9 outputs [57] 
    if (theNumber % 2 != 0 || theNumber < 1) { 
     showUsage(programName); 
     return 0; 
    } 

    ... 

} 

Répondre

8

Le nombre dans le tableau argv est dans une représentation sous forme de chaîne. Vous devez le convertir en nombre entier.

sscanf

int num; 
sscanf (argv[1],"%d",&num); 

ou atoi() (si disponible)

0

Utilisez atoi() ou strol() fonctions.

9

Le moulage ne peut pas faire cela, vous devez réellement analyser la représentation textuelle et la convertir en entier.

La fonction classique pour cela s'appelle atoi(), mais il y a aussi strtol() ou même sscanf().

+3

Ne jamais utiliser 'atoi()', il pourrait ne pas être disponible et il ne * * non ** erreur de vérification que ce soit: http://stackoverflow.com/questions/2729460/usage-of-atoi-in-the-c-language –

+0

Merci, ça l'a fait. –

+1

@Ivo, atoi est spécifié par le standard C si susceptible d'être partout. Il ne vérifie pas les erreurs, il les signale simplement d'une manière non utile (comme zéro). strtol est une meilleure fonction, sauf pour le code quick throwaway, où il est plus difficile à utiliser. –

1

Disons que vous avez un 9 comme argument. Vous avez dit que vous obtenez 57, la valeur ASCII.

Utilisez le fait que int num = *arg[1] - '0' vous donnera le numéro dont vous avez besoin.

si elle est un plus grand nombre comme, 572 alors vous avez besoin

char *p = argv[1]; 
int nr = 0; 
int i; 
for(i =0; i< strlen(p); i++) { 
    nr = 10 * nr + p[i] - '0'; 
} 

Ajouter une vérification des erreurs et son bon d'aller.

Ou, selon ce que vous avez, vous pouvez utiliser certaines fonctions comme atoi(), sscanf(), etc.