Comment analyser les arguments de la ligne de commande entière en C?
Je voudrais un utilisateur à passer deux paramètres ou la laisser vide. Par exemple:
./program 50 50
ou
./program
Quand j'ai essayé d'utiliser int main(int argc, char *argv[])
la première chose que j'ai faite a été de changer char *argv[]
à int *argv[]
mais cela n'a pas fonctionné. Ce que je veux, c'est de l'utilisateur est juste de saisir deux entiers compris entre 0 et 100. Donc, si c'est pas deux entiers, alors il devrait donner une erreur.
J'étais en quelque sorte de penser à donner une erreur avec les types (comme je l'ai utilisé pour programmer en C#) mais ce que j'entre, argv[1] serait 'char' type de tous les temps.
Donc ce que j'ai fait est
for (int i = 0; i <= 100; i++) {
//printf("%d", i);
if (argv[1] == i) {
argcheck++;
printf("1st one %d\n", i);
}
else if (argv[2] == i) {
argcheck++;
printf("2nd one %d\n", i);
}
Cela ne fonctionne pas aussi bien. Aussi, il donne l'avertissement lors de la compilation, mais si je change argv
avec atoi(argv[1])
par exemple, cela donne un Segmentation fault (core dumped) erreur.
J'ai besoin d'un moyen simple de résoudre ce problème.
EDIT:
Donc, je fixe avec atoi()
la raison pour laquelle il était en train de donner la faute de segmentation est parce que j'ai essayer avec la valeur null lorsque je n'ai pas de paramètre. J'ai donc corrigé par l'ajout d'un supplément cond. Mais maintenant le problème est que si la valeur est disons
./program asd asd
Alors la sortie de atoi(argv[1])
serait de 0. Est-il un moyen de modifier cette valeur?
source d'informationauteur Sarp Kaya
Vous devez vous connecter pour publier un commentaire.
Ne pas utiliser
atoi()
et n'utilisez passtrtol()
.atoi()
n'a pas de contrôle d'erreur (que vous l'avez trouvé!) etstrtol()
a d'erreurs vérifiée à l'aide de la globalerrno
variable, ce qui signifie que vous devez définirerrno
à 0, puis d'appelerstrtol()
puis vérifiererrno
encore pour les erreurs. Une meilleure façon est d'utilisersscanf()
qui vous permet également d'analyser n'importe quel type de primitive à partir d'une chaîne, et pas seulement un entier, et il vous permet de lire de fantaisie formats (comme hex).Par exemple, pour analyser entier "1435" à partir d'une chaîne:
Pour analyser un seul caractère 'Z' à partir d'une chaîne
Pour analyser un flotteur "3.1459" à partir d'une chaîne
Pour analyser un grand entier hexadécimal non signé "0x332561" à partir d'une chaîne
Si vous avez besoin de plus d'erreur de manipulation que cela, utiliser une bibliothèque regex.
Cela va faire:
Les arguments sont toujours passés comme des chaînes de caractères, vous ne pouvez pas modifier le prototype de
main()
. Le système d'exploitation et autour des machines toujours passer des chaînes de caractères, et ne sont pas en mesure de comprendre que vous l'avez modifié.Vous avez besoin pour utiliser, par exemple,
strtol()
pour convertir les chaînes de caractères en nombres entiers.Vous voulez vérifier si
sscanf
sera de retour0.
Ci-dessous logique vous aide à
Les choses que vous avez fait innocemment sont gaffe à C. de N'importe quoi, vous avez à prendre des chaînes de caractères ou des caractères que vos arguments, et puis plus tard, vous pouvez faire ce que vous voulez avec eux. Soit les changer en entier à l'aide de
strtol
ou les cordes et vérifier chaque caractère de la chaîne dans la gamme de48 to 57
que ce sont les valeurs décimales dechar 0 to 9
. Personnellement, ce n'est pas une bonne idée et pas que des bonnes pratiques de codage. Mieux les convertir et de vérifier l'intervalle entier vous le souhaitez.Vous pouvez encore utilisation atoiil suffit de vérifier si l'argument est un nombre premier 😉
btw ppl vous dira goto est malmais ils sont généralement un lavage de cerveau par des non-sensible "goto est mauvais""goto c'est mal""goto, c'est le diable" déclarations qui ont été dédaignés mais sans les développer sur internet.
Oui, spaggethi code est de moins en moins gérable. Et goto dans ce contexte, c'est à partir d'un âge où il a remplacé fonctions...
Vous ne pouvez pas modifier les arguments de la fonction main (). Donc, vous devriez utiliser atoi() de la fonction de convertir les arguments de la chaîne en entier.
atoi() a ses inconvénients. En est de même pour strtol() ou strtoul (). Ces fonctions retournent une valeur de 0 si l'entrée de la fonction est non-numérique-je.e utilisateur entre asdf ou autre chose qu'un numéro de série valide. Pour surmonter ce problème, vous devrez analyser la chaîne avant de passer à atoi() et d'appeler appel isdigit() sur chaque personnage pour s'assurer que l'utilisateur a fourni un nombre valide. Après cela, vous pouvez utiliser atoi() pour convertir en entier.
vérifier ce programme, j'ai ajouté une autre bibliothèque stdlib.h et donc je peux convertir le tableau de caractères de la chaîne à l'aide de la fonction atoi.