Vérification de gamme avec des arguments de ligne de commande
-
18-09-2019 - |
Question
Travailler sur un programme simple C je suis coincé avec un test if:
int line_number = 0;
if ((line_number >= argv[2]) && (line_number <= argv[4]))
dit gcc:
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 de lignes que je veux traiter?
La solution
Bien sûr, il ne fonctionne pas: argv
est un pointeur vers pointeur vers char
.. il est pas clair 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 type char*
(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]);
int analysera qui était en tant que troisième paramètre et le placer dans la variable, vous pouvez vérifier ce que vous voulez.
Autres conseils
Vous ne devriez pas utiliser atoi
fonction. Si fait, vous devriez l'oublier jamais existé. Il n'a pas d'utilisation pratique.
Alors que la réponse de Jack a raison de dire que les chaînes de argv
doivent être converties en nombres premiers, en utilisant atoi
à cet effet (en particulier dans la situation où l'entrée vient du « monde extérieur ») est un crime contre la programmation C. Il n'y a pratiquement pas des situations où atoi
peut être utilisé de manière significative 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 */;
La condition de vérification d'erreur exact (comme l'exigence d'*end == '\0'
) dépendra en réalité de votre intention.
Si vous voulez obtenir un int
à la fin, vous devriez également vérifier la valeur pour la plage de int
(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 */