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?

Était-ce utile?

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 */
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top