1
votes

Comment parcourir correctement un argument de ligne de commande pour vérifier si chaque caractère est un chiffre en C?

J'essaie d'itérer sur la deuxième invite de commande qu'un utilisateur entrerait pour vérifier que chaque caractère du tableau est bien un chiffre.

Après avoir regardé ASCII, je sais que les caractères 0-9 vont de 48-57 à 48-57 . J'ai compris que vous pouviez simplement utiliser isdigit() mais je me demande toujours pourquoi ma boucle ne fonctionne pas comme prévu.

#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, string argv[])
{
    if (argc != 2)
    {
        printf("Usage: ./caesar key\n");
        return 1;
    }

    for(int i=0, n=strlen(argv[1]); i<n; i++)
    {
        if((int)argv[1][i] < 48 && (int)argv[1][i] > 57)
        {
            printf("Usage: ./caesar key\n");
            return 1;
        }
    }
}


3 commentaires

Lisez Modern C , consultez cette référence C , la documentation de votre compilateur C (par exemple GCC ...) et du débogueur (par exemple GDB ). Compilez avec tous les avertissements et informations de débogage: gcc -Wall -Wextra -g avec GCC. Utilisez votre débogueur . Inspirez-vous du code existant sur github


Question similaire: stackoverflow.com/questions/61614745/...


argc - Valeur non négative représentant le nombre d'arguments transmis au programme depuis l'environnement dans lequel le programme est exécuté.


3 Réponses :


0
votes
    if((int)argv[1][i] < 48 || (int)argv[1][i] > 57)
    {
        printf("Useage: ./caesar key\n");
        return 1;
    }

0 commentaires

2
votes

Au lieu de cela:

for(int i=0, n=strlen(argv[1]); i<n; i++)
{
    char c = argv[1][i];
    if ((c < '0') || (c > '9'))
    {
        printf("Useage: ./caesar key\n");
        return 1;
    }
}

Ce:

    if ((argv[1][i] < '0') || (argv[1][i] > '9'))

Sur une chronologie assez longue sur Stack Overflow, la foule d'EBCIDIC viendra nous rappeler à tous qu'elle existe toujours. Donc, au lieu de coder en dur les valeurs ordinales pour les caractères ascii, utilisez le littéral de caractère lui-même. Cela rend également l'intention du code beaucoup plus évidente:

    if((int)argv[1][i] < 48 || (int)argv[1][i] > 57)

En ajoutant un peu plus de nettoyage:

    if((int)argv[1][i] < 48 && (int)argv[1][i] > 57)


1 commentaires

quel que soit EBCDIC ou tout jeu de caractères archaïque, utiliser des nombres magiques comme dans if((int)argv[1][i] < 48 && (int)argv[1][i] > 57) est une mauvaise idée. if ((argv[1][i] < '0') || (argv[1][i] > '9')) est beaucoup plus sûr et plus facile à lire



1
votes

int main (int argc, chaîne argv [])

Le type de données chaîne n'est pas défini en C. Ici, vous devez utiliser char* argv[] .
Veuillez voir cette réponse: C a-t-il un type de chaîne?

Les problèmes restants ont été signalés par d'autres utilisateurs.


0 commentaires