C: Vérification de l'argument de ligne de commande est entier ou pas?
Signature de isdigit
int isdigit(int c);
Signature de atoi
int atoi(const char *nptr);
Je voulais juste vérifier si l'argument de ligne de commande qui s'est passé était un entier ou pas.Voici le Code C:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(int argc, char *argv[])
{
if (argc == 1)
return -1;
printf ("Hai, you have executed the program : %s\n", argv[0]);
if (isdigit(atoi(argv[1])))
printf ("%s is a number\n", argv[1]);
else
printf ("%s is not a number\n", argv[1]);
return 0;
}
Mais la sortie n'est pas comme prévu, lorsque je suis de passage un nombre valide:
$ ./a.out 123
Hai, you have executed the program : ./a.out
123 is not a number
$ ./a.out add
Hai, you have executed the program : ./a.out
add is not a number
Je ne pouvais pas comprendre l'erreur.
Plus évident et simple, thread-safe exemple vous pouvez trouver ici "Comment vérifier si une chaîne est le nombre?"
OriginalL'auteur 0aslam0 | 2015-03-25
Vous devez vous connecter pour publier un commentaire.
Lorsque vous vous référez à
argv[1]
, il se réfère à un tableau de caractères contenant la valeur123
.isdigit
fonction est définie pour une seule entrée de caractères.Afin de gérer cette situation, il est préférable de définir une fonction, comme suit:
Vous pouvez utiliser appel isdigit ici pour le faire paraître mieux.
Ok qui peut également être fait. À modifier mon code.
Comment voulez-vous modifier cela, cochez la case pour les nombres négatifs?
Vérifier si le premier caractère est égal à zéro ou non. Je vais modifier mon code pour nombre négatif.
OriginalL'auteur niyasc
sera:
:
:
depuis
123
représente le caractère ASCII'{'
.isdigit(x)
; ici x peut être de 0, 1, 2,...9 seulement?Non, seulement pour
'0'
,'1'
, etc. La valeur de l'entier sont 48 - 57.C'est un nouveau morceau de l'info.
OriginalL'auteur R Sahu
Je pensais que je voudrais ajouter quelque chose pour les réponses déjà ici. En plus de vérifier les nombres en base 10, j'ai pensé qu'il serait utile de vérifier et autoriser les nombres hexadécimaux. J'ai aussi permettre à des nombres négatifs.
J'ai aussi ajouté quelques petites choses à vérifier mauvaise entrée (par exemple pointeur null, lettres à l'intérieur d'une chaîne de caractères représentant un nombre décimal, ou invalide lettres à l'intérieur d'une chaîne de caractères représentant un nombre hexadécimal).
Noter que j'utilise le
to_lower(char c)
fonction afin de s'assurer que les lettres représentant hexadécimal sera en bas de casse, juste pour des raisons de commodité.Je retourne 1 (vrai) si la chaîne est un nombre valide, 0 si elle ne l'est pas. Si c'est un nombre valide, je stocke la base à l'intérieur du paramètre de base.
J'ai utilisé cette fonction comme ceci:
OriginalL'auteur mgarey
appel isdigit() fonction vérifie pour un chiffre ('0' à '9'), qui dépend bien sûr de valeurs ASCII. Maintenant, la valeur de retour à partir de votre atoi ne relève pas de valeur ASCII entre '0' à '9'. donc, c'est montrer qu'il n'est pas un nombre.
OriginalL'auteur Chintan Patel
Je ne sais pas ce
isdigit
exactement, mais en raison de nom, je pense qu'il devrait prendre unchar
argument, vérifier le char étant un chiffre, est-il?Je voudrais écrire comme ceci: (omis, la fonction shell, juste montrer le code de base)
atoi
? Mieux de ne pas abuser de la fonctionQuand j'ai regardé la signature de
isdigit
, j'ai vu qu'il accepte une entrée entière. J'ai donc voulu la convertir l'argument de type entier (si l'argument est en effet un entier)et ensuite faire le chèque. Mais l'idée a été entaché d'irrégularités. En outreatoi
n'a pas de contrôle d'erreur.OriginalL'auteur Cherry
OriginalL'auteur Yosephhhhhh