J’essaie de valider les entrées utilisateur à partir de la ligne de commande avec argc et argv, mais je rencontre un problème de segmentation et je ne sais pas pourquoi.
Je veux valider que l’utilisateur a entré un int positif (donc argc = 2 et argv est positif).
Voici mon code:
int main (int argc, ssortingng argv[]) { int k = atoi(argv[1]); if (argc != 2 && k <1) { return 1; } }
La partie k <1 de mon code semble bien fonctionner, mais je reçois des erreurs de segmentation à chaque fois que j'essaie de l'exécuter sans le nom du programme et un argument (agrc! = 2).
MODIFIER:
Description plus claire du problème de gestion des erreurs:
Si je lance ./myprogram -2, je reçois mon retour 1 comme prévu.
Si je lance ./myprogram hjdksfhdsk, je reçois mon retour 1 comme prévu.
Si je lance ./myprogram, je reçois une erreur de segmentation.
C’est ce comportement qui me fait penser que ma gestion de la valeur argc est en cause, mais je ne sais pas pourquoi je ne peux pas simplement tester argc! = 2.
Ceci est incorrect, car en C, ssortingng
n’est pas un type intégré (et n’est pas un type standard défini dans un en-tête standard – notez que C ++ a std :: ssortingng défini dans son en-tête standard
).
La signature de main
doit être
int main(int argc, char**argv);
La convention est que argv[argc]
est le pointeur null, et les pointeurs argc
de argv[0]
à argv[argc-1]
sont des pointeurs non nuls vers des chaînes à terminaison nulle.
Notez que (du moins sur les systèmes Linux et Posix) les arguments de programme ne sont pas une entrée utilisateur dans le programme. Le shell a reçu une ligne de commande en entrée et a développé cette ligne de commande en arguments de programme. Votre programme pourrait ultérieurement lire certaines entrées, par exemple avec scanf
.
Vous ne pouvez pas convertir un pointeur NULL
avec atoi
, vous devriez donc vérifier argc
avant d’effectuer la conversion.
int main(int argc, char**argv) { if (argc!=2) { fprintf(stderr, "%s needs two arguments\n", argv[0]); exit(EXIT_FAILURE); }; int k = atoi(argv[1]); if (k<=0) { fprintf(stderr, "%s wants a positive first argument, but got %s\n", argv[1]); exit(EXIT_FAILURE); } // now do the real thing }
En passant, je pense que (du moins sur les systèmes Linux ou Posix), un programme devrait accepter l’argument --help
conformément à la norme de codage GNU . Je vous suggère d'utiliser getopt (notamment getopt_long
) ou argp pour parsingr les arguments du programme.
Enfin, comstackz avec tous les avertissements et les informations de débogage (par exemple avec gcc -Wall -g
) et apprenez à utiliser le débogueur (par exemple, gdb
).
Votre principale devrait être
int main(int argc, char*argv[])
Et faites le atoi
avant d’utiliser atoi
sur argv[1]
De plus, tous les chemins doivent renvoyer une valeur. return 0;
bonde return 0;
à la fin
Comme d’autres l’ont fait remarquer, chaîne n’est pas un type de base. Toutefois, puisque vous obtenez des résultats dans un cas, votre erreur de segmentation est liée à atoi on argv 1. Les tableaux c sont basés sur 0 et vous essayez de convertir la mémoire non initialisée. Utilisez le test d’argc avant l’atoi.