Comparaison chaine de caractère plus grand/plus petit

Fermé
Arkoy - Modifié le 1 déc. 2022 à 11:37
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 3 nov. 2022 à 20:03

Bonjour,

J'ai un exercice qui consiste à récupérer les arguments du programme et les comparer pour vérifier si ceux-ci sont bien donnés dans l'ordre croissant. Le hic, c'est que je n'arrive pas du tout à comparer des chaînes de caractères pour cet usage.

Voici mon code :

int main(int argc, char *argv[]){
    int test = 1;
    for (int i = 1; i <= argc - 1; i++){
        if (argv[i] < argv[i-1]){  
           test = 0;
        }
    ]
    printf("%d \n",test);
}
A voir également:

3 réponses

[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié le 2 nov. 2022 à 14:12

Bonjour Whismeril,

Ce lien renvoie vers les fonctions de manipulation de chaînes suivantes : strcpy, strncpy, strcat, strncat, strlen, strcmp et strncmp.

Aucune de ces fonctions ne permet de comparer des nombres sous forme de chaînes.

Par exemple, strcmp() va considérer que "8" est supérieur à "2203" parce que la première lettre '8' a un code ASCII supérieur au code ASCII de la première lettre '2' du second.

0
Utilisateur anonyme > [Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024
2 nov. 2022 à 19:29

Salut,

oui, c'est comme ça que j'ai compris la question.

Mais cela peut-être une mauvaise interprétation de ma part.

0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié le 2 nov. 2022 à 14:17

Salut Arkoy,

Il faudrait, je pense, convertir les chaînes en types numériques entiers ou doubles.

Il y a des fonctions permettant de faire cela dans la bibliothèque standard du C.

https://cplusplus.com/reference/cstdlib/strtol/

https://cplusplus.com/reference/cstdlib/strtod/

0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié le 3 nov. 2022 à 15:05

Aussi, à supposer que tu convertisse les nombres saisis, argv[0] contient le nom de la commande, argv[i], pour i allant de 1 à argc-1, le ième argument.

Si tu tapes :

mon_programme.exe 2 4 8 16 32

Tu ne peux donc pas comparer le contenu de argv[1] (qui contient "2") à celui de argv[0] (qui contient "mon_programme.exe").

Par ailleurs, il faudrait certainement que l'utilisateur tape au moins 2 arguments pour que le programme compare quoi que ce soit et décider si tu acceptes un seul argument (si tu décides que ton programme peut affirmer qu'une liste de 1 nombre est dans un ordre croissant).

Tu pourrais aussi créer une fonction qui fait ce travail, au lieu de mettre tout dans main(), de façon à ce que tu puisses tester ta fonction automatiquement, au lieu de devoir la tester en tapant manuellement des valeurs.

0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié le 3 nov. 2022 à 20:06

Salut Arkoy,

Je t'ai donné des indications qui devraient te permettre de comprendre quoi faire. Si tu as des questions ou des problèmes n'hésite pas à revenir sur le forum pour poser tes questions ou expliquer tes problèmes.

Pour te présenter l'intérêt de la suggestion suivante que je t'ai faite :

Tu pourrais aussi créer une fonction qui fait ce travail, au lieu de mettre tout dans main(), de façon à ce que tu puisses tester ta fonction automatiquement, au lieu de devoir la tester en tapant manuellement des valeurs.

J'ai écris quelques lignes proposant un exemple de cadre de travail avec une fonction is_argv_ordered() qui est lancée par main() qui fait le travail, et que tu peux tester selon les différents cas à traiter. Dans ce cadre,je suppose que ce sont des entiers qui sont attendus et qu'il faut au moins une valeur entière passée, autrement, une erreur doit être rapportée.

Le fonction retourne un entier supérieur à 1 s'il y a une erreur dans les données fournies (nombre insuffisant de paramètres, saisie d'autre chose que des entiers), et retourne 0 ou 1 si les données fournies sont correctes, 0 signifiant que l'ordre n'est pas croissant et 1 signifiant que l'ordre est bien croissant.

Un tableau statique de chaînes de caractères permet d'afficher le résultat, mais ce n'est pas le plus important.

Le coeur de ce qui est demandé est dans la fonction is_argv_ordered().

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

enum errors_is_argv_ordered { ERR_IAO_NO_PARAM = 2, ERR_IAO_NOT_INT, ERR_IAO_NOT_IMPLEMENTED };
const char * st_result[] = {
        "the parameters are valid but not in ascending order",
        "the parameters are valid and in ascending order",
        "error: no parameters were given, please provide a list of integers separated by space",
        "error: invalid parameters, please provide a list of integers separated by space",
        "error: is_argv_ordered() is not implemented yet"
};

/**
 * is_argv_ordered() - test if argv is ordered
 * @argc: count of arguments
 * @argv: array of strings
 *
 * tests if the integer numbers passed as arguments are in ascending number
 * at least one integer shall be passed
 *
 * return:
 * 0 means the parameters are valid but not in ascending order
 * 1 means the parameters are valid and in ascending order
 * higher values reports an error number in the enum errors_is_argv_ordered
 */
int is_argv_ordered(int argc, char * argv[]) {
        /* TODO */
        return ERR_IAO_NOT_IMPLEMENTED;
}

/* define TESTING macro to execute unit tests */
#define TESTING

int main(int argc, char * argv[]) {
#ifndef TESTING
        printf("%s\n", st_result[is_argv_ordered(argc, argv)]);
#else
        /*
         * test suite for is_argv_ordered()
         */
        /* ignoring actual argc and argv and use our test cases */
        (void) argc;
        (void) argv;
        {
        int ac = 1;
        char * av[] = {
                "mon_programme.exe"
        };
        assert(is_argv_ordered(ac, av) == ERR_IAO_NO_PARAM &&
                        "error if no argument passed");
        } {
        int ac = 2;
        char * av[] = {
                "mon_programme.exe",
                "12toto"
        };
        assert(is_argv_ordered(ac, av) == ERR_IAO_NOT_INT &&
                        "error if a non integer argument is passed");
        } {
        int ac = 2;
        char * av[] = {
                "mon_programme.exe",
                "2"
        };
        assert(is_argv_ordered(ac, av) == 1 &&
                        "return true if only one integer is passed");
        } {
        int ac = 3;
        char * av[] = {
                "mon_programme.exe",
                "2",
                "toto"
        };
        assert(is_argv_ordered(ac, av) == ERR_IAO_NOT_INT &&
                        "error if second parameter is a non integer");
        } {
        int ac = 3;
        char * av[] = {
                "mon_programme.exe",
                "2",
                "4"
        };
        assert(is_argv_ordered(ac, av) == 1 &&
                        "return true passing 2 4");
        } {
        int ac = 3;
        char * av[] = {
                "mon_programme.exe",
                "4",
                "2"
        };
        assert(is_argv_ordered(ac, av) == 0 &&
                        "return false passing 4 2");
        } {
        int ac = 4;
        char * av[] = {
                "mon_programme.exe",
                "2",
                "8",
                "4"
        };
        assert(is_argv_ordered(ac, av) == 0 &&
                        "return false passing 2 8 4");
        } {
        int ac = 4;
        char * av[] = {
                "mon_programme.exe",
                "2",
                "4",
                "8"
        };
        assert(is_argv_ordered(ac, av) == 1 &&
                        "return true passing 2 4 8");
        } {
        int ac = 6;
        char * av[] = {
                "mon_programme.exe",
                "2",
                "4",
                "8",
                "16",
                "32"
        };
        assert(is_argv_ordered(ac, av) == 1 &&
                        "return true passing 2 4 8 16 32");
        } {
        int ac = 6;
        char * av[] = {
                "mon_programme.exe",
                "2",
                "4",
                "8",
                "32",
                "16"
        };
        assert(is_argv_ordered(ac, av) == 0 &&
                        "return false passing 2 4 8 32 16");
        } {
        int ac = 6;
        char * av[] = {
                "mon_programme.exe",
                "2",
                "4",
                "8",
                "16",
                "toto"
        };
        assert(is_argv_ordered(ac, av) == ERR_IAO_NOT_INT &&
                        "error if non integer argument is passed anywhere");
        }
#endif

        return 0;
}

Il y a 11 tests qui simulent différents cas de données tapées par un utilisateur, permettant de tester automatiquement les différents cas de figure pouvant se présenter durant la mise au point du programme.

Ton travail est de faire passer ces tests un par un en écrivant progressivement le contenu d ela fonction is_argv_ordered(). Lorsque les 11 tests passent, tu auras certainement achevé ton programme et tu pourras commenter la ligne 31 "#define TESTING" pour que ton main appelle la fonction avec les vrais paramètres arc et argv passés au programme par un utilisateur humain et affiche le résultat.

Les tests sont conçus pour être passés un par un par degré de difficulté, pour écrire progressivement un code générique.

La méthode est la suivante :

  • essaye juste d'écrire le code nécessaire pour que le test N passe sans casser les tests précédents
  • lorsque tu as fait cela, vois si tu peux améliorer ton code tout en vérifiant qu'il passe toujours le test N et tous les tests précédents
  • passe au test suivant

0