2 votes

Lire les arguments de la ligne de commande en C et vérifier s'il s'agit d'un chiffre

Détails sur mon objectif

En C, mon programme est censé prendre une entrée de la ligne de commande, la lire, s'assurer qu'il s'agit bien d'un chiffre, puis imprimer "Success" si true, "Usage : ./caesar key" si faux.

Résultats attendus

./caesar 33
Success

o

./caesar zzz
Usage: ./caesar key

Résultats réels

./caesar 33
Segmentation error

Ce que j'ai essayé

 int main (int argc, string argv[])
 {
   if (argc == 2)
   {
      if (isdigit(argv[1]))
      {
        printf("Success\n");
        return 0;
      }

o

if (argc == 2)
{
  if (isdigit(argv[0][1]))
  {
    printf("Success\n");
    return 0;
 }

o

int main (int argc, string argv[])
{
   if (argc == 2 && isdigit(argv[1]))
   {
     printf("Success\n");
     return 0;
   }

5voto

Param Siddharth Points 603

Ce que vous faites mal ici, c'est que vous voulez vérifier si la chaîne entière est composée de chiffres, mais vous passez la chaîne elle-même à isdigit qui s'attend à ce qu'un char . Ce que vous pouvez faire, c'est itérer manuellement à travers le fichier char et vérifier si chaque char est un chiffre, ou vous pouvez utiliser la fonction strspn comme indiqué ci-dessous.

strspn(argv[1], "0123456789") == strlen(argv[1])

Cette fonction compare l'étendue des chiffres dans l'argument et renvoie un résultat positif si elle est identique à la longueur de la chaîne elle-même. Si vous souhaitez autoriser les signes + et - dans l'argument, utilisez "-+0123456789" à l'intérieur strspn mais cela donnerait lieu à un faux positif dans des cas tels que +++++ (comme mentionné par @dreamcrash ci-dessous), c'est pourquoi la définition d'une fonction personnalisée est toujours une meilleure option. Les deux fonctions strspn y strlen sont disponibles dans l'application string.h l'en-tête.

2voto

dreamcrash Points 8227

Si vous n'avez pas besoin d'utiliser le isdigit vous pouvez utiliser la fonction strspn comme l'a suggéré @Param Siddharth. Cependant, il s'agit de plusieurs cas de figure en utilisant

if (strspn(string, "-+0123456789") == strlen(string))

par exemple que les valeurs comme "-----" serait considéré comme un numéro valide .

Si vous souhaitez utiliser le isdigit que vous devez passer par toutes les fonctions char dans les Chaîne (au lieu de transmettre l'intégralité du Chaîne en une seule fois) et vérifier si chacun d'entre eux est bien un chiffre :

    ...
    int i, is_number = 1;
    for (i = 0; is_number && argv[1][i] != '\0'; i++){
        if(i == 0 && (argv[1][i] == '-' || argv[1][i] == '+')){
           continue;
        }   
        is_number = isdigit(string[i]);
     }
     // It should fail for Strings that are : empty, only "-" or "+"
    if(i == 0 || (i == 1 && !isdigit(argv[1][0])) || !is_number){
        printf("The String is not a Number \n");
        return 1;
     }
     printf("Success\n");
     return 0;
}

J'ai testé avec les entrées :

  • "-", pas un nombre
  • "", pas un nombre
  • "-1", nombre
  • "+1", nombre
  • "+1+1" n'est pas un nombre

1voto

int main (int argc, string argv[])

string n'est pas défini en C. Le deuxième argument devrait être char* argv[] .

Veuillez consulter la réponse : https://stackoverflow.com/questions/14709323/does-c-have-a-string-type#:~:text=Il n'y a%20pas%20de%20chaîne%20de%20type,un%20caractère%20supplémentaire%20zéro%20de%20termination%20de%20caractère .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X