IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Tester une chaine de caractères


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 35
    Points : 34
    Points
    34
    Par défaut Tester une chaine de caractères
    Bonjour, j'essaye d'écrire un programme où la valeur de la variable Choix devient 1 si on saisit le mot "oui" au début.
    J'y arrive pour un caractère seul mais pas moyen de le faire avec une chaine de caractères.

    Le mot "oui" s'affiche bien à l'écran, mais le test échoue. Si je tape oui, Choix prend la valeur 0 (c'est le else qui s'exécute), or il doit prendre la valeur 1.
    D'ailleurs si quelqu'un peut m'indiquer comment définir 1 en TRUE (avec typedef peut-être?), ce serait super. Mais le plus important est de réussir le test if.

    Voila ma fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    void ChoisirPompes(int Choix[])
    {
    char rep1[4];
    getchar();
    printf("Mettre en marche la pompe 1 ? Saisir oui ou non: ");
    scanf("%s", rep1);
     
    printf("\rep1: %s\n", rep1);
     
    if(rep1 == 'oui')
    {
    Choix[0] = 1;
    Choix[1] = 0;
    Choix[2] = 0;}
    else{
    Choix[0] = 0;
    Choix[1] = 0;
    Choix[2] = 0;
    }
    printf("choix pompe: %d\n", Choix[0]);
    return Choix;
    }
    Je n'ai pas mis tout mon programme car il est très long, mais le problème vient de la fonction de toute évidence. J'ai essayé d'écrire le test différemment, tel que: if(rep1 == 'o', 'u', 'i') par exemple, mais ça ne marche pas.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 628
    Points : 10 553
    Points
    10 553
    Par défaut
    if(rep1 == 'oui') <- Ceci est une horreur 1) tu testes 2 pointeurs 2) tu crées un caractère multiple (en C les chaînes de caractères sont entre doubles guillemets "XXXX")

    Tu as strcmp et strncmp et petits frères.

    Sinon le code brut comme tu n'as que 4 caractères à tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (((rep1[0] == 'o') || (rep1[0] == 'O')) && ((rep1[1] == 'u') || (rep1[1] == 'U')) && ((rep1[2] == 'i') || (rep1[2] == 'I'))) {}
     
    // or
     
    if (((rep1[0] == 'o') || (rep1[0] == 'O')) && ((rep1[1] == 'u') || (rep1[1] == 'U')) && ((rep1[2] == 'i') || (rep1[2] == 'I'))  && (rep1[3] == '\0')) {}

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 35
    Points : 34
    Points
    34
    Par défaut
    Merci pour la réponse! Et je viens d'essayer la fonction strcmp, ça marche également. Par contre je ne comprend pas quelque chose.
    J'ai mis: if (strcmp (rep1, "oui") == 0), le test fonctionne. Mais à quoi sert le "== 0"?

    J'ai copié sur un autre programme mais sans savoir ce que ça signifie, j'aimerais quand même savoir ce que je fais.
    Je vois bien qu'on compare la chaine rep1 à 0 avec l'opérateur de comparaison ==, mais dans quel but?

  4. #4
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Bonjour,
    c'est là que consulter la doc est important. Un google ou un man vont vite t'apprendre que :
    NAME
    strcmp, strncmp - compare two strings

    SYNOPSIS
    #include <string.h>

    int strcmp(const char *s1, const char *s2);

    int strncmp(const char *s1, const char *s2, size_t n);

    DESCRIPTION
    The strcmp() function compares the two strings s1 and s2. It returns an integer less than, equal to, or
    greater than zero if s1 is found, respectively, to be less than, to match, or be greater than s2.

    The strncmp() function is similar, except it compares only the first (at most) n bytes of s1 and s2.

    RETURN VALUE
    The strcmp() and strncmp() functions return an integer less than, equal to, or greater than zero if s1 (or the
    first n bytes thereof) is found, respectively, to be less than, to match, or be greater than s2.
    oui, lire la doc c'est un bon réflexe. Suivre des tutos qui expliquent c'est bien aussi.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 675
    Points : 30 963
    Points
    30 963
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Kawamx Voir le message
    Merci pour la réponse! Et je viens d'essayer la fonction strcmp, ça marche également.
    Bonjour
    Ce n'est pas "ça marche également" mais "ça marche tout court". strcmp() est l'outil qui permet de comparer 2 chaines et il n'y en a pas d'autres.

    Citation Envoyé par Kawamx Voir le message
    Par contre je ne comprend pas quelque chose.
    J'ai mis: if (strcmp (rep1, "oui") == 0), le test fonctionne. Mais à quoi sert le "== 0"?
    Ca te sert à comparer le retour de la fonction avec la valeur numérique "0"

    Citation Envoyé par Kawamx Voir le message
    J'ai copié sur un autre programme mais sans savoir ce que ça signifie, j'aimerais quand même savoir ce que je fais.
    C'est effectivement plus sage. Il te faut donc pour ça lire la doc de strcmp dans un premier temps; et dans un second comprendre ce qu'est réellement une chaine de caractères en C.

    En C, le type "chaine" n'existe pas. Les concepteurs du langage ont donc établi la convention qu'une chaine serait représenté par un tableau de caractères (d'où la réponse de foetus qui teste individuellement chaque caractère du tableau "rep1") et que le nom de la variable représentant cette chaine (ici "rep1") contiendrait simplement l'adresse du premier caractère de la chaine. Comme un tableau est toujours contigü en mémoire, avec le premier caractère on peut aisément passer au suivant puis au suivant etc.
    Il ne restait alors plus qu'à définir comment savoir où s'arrêter ce qui s'est fait en disant que le dernier caractère du tableau contiendrait le caractère '\0'.

    Ainsi la chaine "oui" est en réalité le tableau {'o', 'u', 'i', '\0'}.
    Une fois qu'on comprend ça, 1) on se rend compte que comparer if ("oui" == "oui") revient à comparer 2 adresses différentes (puisque 2 tableaux distincts même si leur contenu est le même) et 2) on réalise que si on veut comparer 2 chaines il faut alors créer un algo qui boucle en parallèle sur chaque caractère des 2 tableaux et qui les examine 2 à 2 et 3) on se dit que ce truc doit certainement déjà être fait par les concepteurs et on tombe alors sur la fonction "strcmp".
    Et si on va un poil plus loin, alors 4) on se dit que puisque la fonction compare en parallèle chaque caractère des 2 tableaux ; elle doit pouvoir aussi dire, quand ils sont inégaux, si le premier est plus petit ou plus grand que le second ce qui, conventionnellement, rend la chaine 1 plus petite ou plus grande que la seconde. D'où la conclusion que si strcmp() renvoie 0 c'est que les chaines sont égales, si elle renvoie -1 (ou officiellement une valeur inférieure à 0) c'est que la chaine 1 est plus petite que la chaine 2 et si elle renvoie 1 (ou officiellement une valeur supérieure à 0) c'est que la chaine 1 est plus grande que la chaine 2.
    Et voilà comment d'une seule chose on obtient 3 renseignements possibles...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. tester une chaine de caractères
    Par toti92 dans le forum C++
    Réponses: 4
    Dernier message: 13/02/2014, 22h59
  2. Tester une chaine de caractère
    Par osso045 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 22/10/2010, 12h39
  3. Réponses: 4
    Dernier message: 24/04/2007, 21h58
  4. Réponses: 6
    Dernier message: 14/12/2006, 17h27
  5. Réponses: 1
    Dernier message: 24/11/2006, 17h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo