2010-03-08 7 views
1

travail sur un programme simple C je suis coincé avec un test if:gamme Checking avec des arguments de ligne de commande

int line_number = 0; 
if ((line_number >= argv[2]) && (line_number <= argv[4])) 

gcc dit:

 
cp.c:25: warning: comparison between pointer and integer 
cp.c:25: warning: comparison between pointer and integer 

Que puis-je faire pour vérifier correctement la gamme des lignes que je veux traiter?

+1

Vous trouverez peut-être utile de structurer les contrôles de gamme tout en "une ligne", par exemple 'if (a <= b && b <= c)', ce qui représente la signification de 'a <= b <= c'. –

Répondre

8

Bien sûr, il ne fonctionne pas: argv est un pointeur vers pointeur vers char .. on ne sait pas ce que vous voulez faire, mais penser que argv[2] est le troisième paramètre et argv[4] est cinquième. Mais ils sont de char* de type (ils sont des chaînes), donc si vous voulez les analyser comme des entiers, vous devriez le faire en utilisant la fonction atoi:

int value = atoi(argv[2]); 

analysera int qui était en tant que troisième paramètre et le placer dans la variable, alors vous pouvez vérifier ce que vous voulez.

+0

Merci Jack, vous avez fait le jour de myd :) – Zenet

+3

Eh bien, vous probablement * devrait * le faire en utilisant 'strtol'. 'atoi' est plus facile à utiliser mais plus difficile à gérer. –

2

Vous ne devriez pas utiliser la fonction atoi. En fait, vous devriez oublier qu'il a déjà existé. Il n'a pas d'utilisation pratique. Bien que la réponse de Jack soit correcte en affirmant que les chaînes argv doivent d'abord être converties en nombres, utiliser atoi à cet effet (spécifiquement dans le cas où l'entrée provient du "monde extérieur") est un crime contre la programmation en C . Il n'y a pratiquement aucune situation où atoi peut être utilement utilisé dans un programme.

La fonction que vous devriez utiliser dans ce cas est strtol

char *end; 
long long_value = strtol(argv[2], &end, 10); 
if (*end != '\0' || errno == ERANGE) 
    /* Conversion error happened */; 

L'état de vérification d'erreur exacte (comme l'exigence d'*end == '\0') dépendra en réalité de votre intention.

Si vous souhaitez obtenir un int à la fin, vous devriez également vérifier la valeur de int plage (ou pour votre gamme spécifique à l'application)

if (long_value < INT_MIN || long_value > INT_MAX) 
    /* Out of bounds error */; 

int value = long_value; 
/* This is your final value */ 
+0

Même si je suis d'accord que vous ne devriez pas utiliser atoi * la plupart du temps, il est pratique de l'utiliser quand vous savez déjà que l'entrée est valide. Par exemple, vous avez peut-être déjà validé les données par rapport à une grammaire BNF dans le cadre d'une analyse plus importante. –

+1

"réponse précédente"? C'est la réponse la mieux notée. Il n'y a pas de "précédent". 'atoi' n'apparaît nulle part dans la question. Pouvez-vous éditer cette réponse afin qu'elle ait du sens en tant que réponse «autonome»? –

+0

Merci Andrey pour votre réponse, mais je ne vois pas pourquoi je ne devrais jamais utiliser atoi? n'est-ce pas une fonction POSIX? – Zenet

Questions connexes