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 :

qu'est ce qu'une chaîne vide?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 40
    Par défaut qu'est ce qu'une chaîne vide?
    Bonjour à tous,
    j'ai une portion de code qui vise à afficher à l'écran, toutes les lignes d'un fichier qui répondent à deux conditions:
    • la chaîne lue ne contient pas à la chaîne appelée chaine

    • la chaîne lue n'est pas la chaîne vide

    Ce que je traduis en test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      if (fgets(ligne_a_lire,TAILLE_BUFF,pfichier)!=NULL)
         {// une ligne existe
           if ((strstr(ligne_a_lire,chaine)==NULL)||(strcmp(ligne_a_lire,"")!=0)
           {         printf("\nligne lue: %s \n",ligne_a_lire);
           }//fin du if
    Vu que ça ne donnait pas les bons résultats j'ai séparé mes deux conditions en deux tests.
    Le premier test strstr se passe bien, mais le test de comparaison avec la chaîne vide reste infructueux.
    "" est-il une mauvaise formulation d'une chaîne vide lue dans un fichier?
    P.S: même résultat avec " \0".
    Merci bien

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    D'abord il te faut un ET et non pas un OU
    Ensuite comparer une chaine à vide est absurde..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
           if ((strstr(ligne_a_lire,chaine)==NULL) 
                && (strlen(ligne_a_lire) > 0))

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par ladygtk
    j'ai une portion de code qui vise à afficher à l'écran, toutes les lignes d'un fichierqui répondent à deux conditions:
    • la chaîne lue ne contient pas à la chaîne appelée chaine

    • la chaîne lue n'est pas la chaîne vide
    Mauvaise terminologie menant à du code faux.

    Un fichier texte est organisé en lignes, c'est à dire en séquences de caractères terminées par un '\n'.

    Rappel : il n'y a pas de 0 dans un fichier texte.

    Reformulation :

    • la ligne lue ne contient pas à la chaine appelée chaine
    • la ligne lue n'est pas une ligne vide

    Ca devrait être beaucoup plus clair comme ça...

    La bonne rédaction des spécification, c'est essentiel. Evidemment, ce n'est jamais enseigné...

    Remarque concernant l'implémentation. Je rappelle que fgets() prend le '\n' (quand il peut...)

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 69
    Par défaut
    Citation Envoyé par Emmanuel Delahaye

    La bonne rédaction des spécification, c'est essentiel. Evidemment, ce n'est jamais enseigné...
    Bien sûr que si. Je te sens un peu révolté contre l'enseignement...

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par DaffyDuck
    Bien sûr que si. Je te sens un peu révolté contre l'enseignement...
    Je vois le résultat (recrutement, questions étranges sur les forums...)

  6. #6
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Il y a des failles, c'est certain! Mais tout dans l'enseignement n'est pas à jeter, bien loin de là. Le problème, c'est que les gens qui savent et qui maîtrisent leur sujet, soit ils ne postent pas, soit ils répondent aux questions.

    C'est donc trompeur de se baser sur les questions posées par les débutants pour évaluer la qualité de l'enseignement. Je sais pas comme c'est en France, mais je trouve qu'ici, les gens sont dans la majorité plutôt bien formé.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par mujigka
    Il y a des failles, c'est certain! Mais tout dans l'enseignement n'est pas à jeter, bien loin de là. Le problème, c'est que les gens qui savent et qui maîtrisent leur sujet, soit ils ne postent pas, soit ils répondent aux questions.

    C'est donc trompeur de se baser sur les questions posées par les débutants pour évaluer la qualité de l'enseignement. Je sais pas comme c'est en France, mais je trouve qu'ici, les gens sont dans la majorité plutôt bien formé.
    Je ne serais pas étonné que l'enseignement technique soit meilleur en Suisse qu'en France... plus de moyens, politique libérale, coopération université/entreprise... Un peu comme en Irlande, non ? L'entreprise, c'est pas le Diable chez vous, si ?

    En France, les facs sont les derniers refuges du marxisme et de la lutte de classes. L'entreprise, çaÿ mal. L'apprentissage, çaÿ mal. La séléction, çaÿ mal.

    Résultat, déconnexion totale entre les mondes universitaires et réels... Etudes inadaptées, profusion des écoles privées hors de prix, enseignement à deux vitesses, production massive de chomeurs... et des entreprises qui rament pour avoir de bons ingénieurs...

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 40
    Par défaut ligne à la place de chaîne
    Citation Envoyé par Emmanuel Delahaye
    Mauvaise terminologie menant à du code faux.

    Un fichier texte est organisé en lignes, c'est à dire en séquences de caractères terminées par un '\n'.

    Rappel : il n'y a pas de 0 dans un fichier texte.

    Reformulation :

    • la ligne lue ne contient pas à la chaine appelée chaine
    • la ligne lue n'est pas une ligne vide

    Ca devrait être beaucoup plus clair comme ça...

    La bonne rédaction des spécification, c'est essentiel. Evidemment, ce n'est jamais enseigné...

    Remarque concernant l'implémentation. Je rappelle que fgets() prend le '\n' (quand il peut...)
    Bonjour, merci pour ces infos. Si j'ai écrit chaîne dans mes spécifications c parce que je ne parlais pas du fgets mais de la variable 'ligne_a_lire' qui est une chaîne de caractères.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 40
    Par défaut Pour participer au le débat sur l'enseignement en France
    En effet, je n'ai pas eu beaucoup de base théorique en C. Un seul CM a eu lieu (2-3h je ne sais plus), et c'était vraiment inutile comme cours. Ensuite on a eu que des TP durant le premier semestre.
    Après deux ans à avoir étudier le pascal (celui-là étudié dans de bonnes conditions: CM, TD,TP, projets). On nous a mis au C. Et on apprend sur le tas en pratiquant. Maintenant je suis gênée de poser des questions qui te paraissent aberrantes. Mais avec un prof pour quarante élèves en TP, c'est de nous mêmes qu'on apprend. On regarde ailleurs, on lit, on surfe, et on pose des questions sur des forums.
    J'espère t'avoir fait relativiser les choses.
    A bientôt

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par ladygtk
    En effet, je n'ai pas eu beaucoup de base théorique en C. Un seul CM a eu lieu (2-3h je ne sais plus), et c'était vraiment inutile comme cours. Ensuite on a eu que des TP durant le premier semestre.
    Après deux ans à avoir étudier le pascal (celui-là étudié dans de bonnes conditions: CM, TD,TP, projets). On nous a mis au C. Et on apprend sur le tas en pratiquant. Maintenant je suis gênée de poser des questions qui te paraissent aberrantes. Mais avec un prof pour quarante élèves en TP, c'est de nous mêmes qu'on apprend. On regarde ailleurs, on lit, on surfe, et on pose des questions sur des forums.
    Fait pas être gênée de poser des questions. Ta remarque est intéressante et en dit long sur l'incapacité des universités françaises à enseigner la programmation correctement...

    Ce qui est aberrant, c'est qu'on a l'impression que les étudiants sont livrés à eux mêmes, et que si il n'y a pas les forums (bénévoles, je le rappelle), ils ne pourront pas se former. OK. Mais alors ils sont payés à faire quoi ces profs de facs ?

  11. #11
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Je crois qu'il faut se poser une question, quel le but exact de l'enseignement prodigué dans un cours ?
    Apprendre le langage C est tout à fait différent d'apprendre à programmer, et tout à fait différent d'apprendre à conduire un projet de développement.
    Apprendre l'anglais ce n'est pas apprendre la culture anglaise.
    Que la conduite de projet ne soit pas enseignée, d'accord c'est un problème, mais ce n'est pas une raison pour s'en prendre aux profs, ce n'est pas ce qu'on demande si on leur demande d'enseigner un langage. La conduite de projet est une matière à part et indépendante du langage utilisé.
    D'autre part, à mon avis, un bon enseignant doit donner à ses élèves les clefs pour comprendre et approfondir, un bon enseignant doit apprendre à apprendre à ses éléves il ne peut de toute façon tout leur apprendre.
    Enfin, sur ce forum tu n'as que le son d' une cloche, celui des élèves, il faudrait aussi éventuellement avoir l'autre son.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut

    fgets() enregistre aussi le \n tapé.
    Il faut purger la ligne lue avant de faire les comparaisons.

    http://emmanuel-delahaye.developpez....s.htm#fichiers
    sous-sous-titre "gestion des fins de ligne"
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Médinoc

    fgets() enregistre aussi le \n tapé.
    Il faut purger la ligne lue avant de faire les comparaisons.
    lol oui mais là tu rentres dans des subtilités qui visiblement sont pas encore de mise....

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Bon, alors un petit copier-coller-mutiler du code en question pour faire simple ?
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #include <stdio.h>
    #include <string.h>
     
    int PurgerLigneEtStdin(char *ligne)
    {
       /* chercher le '\n' */
       char *p = strchr(ligne, '\n');
     
       if (p != NULL)
       {
          /* si on l'a trouve, on l'elimine. */
          *p = '\0';
       }
       else
       {
          /* Ici, on a choisi d'ignorer les autres caracteres. */
     
          int c;
          while ((c = fgetc(stdin)) != '\n' && c != EOF)
          {
          }
       }
    }
     
    /* Et ça s'utilise ainsi: */
    int main(void)
    {
       char buf[40];
     
       printf("Entrer une ligne (%d caracteres max) :\n", (int)(sizeof(buf)-1));
       fgets(buf, sizeof(buf), stdin);
       PurgerLigneEtStdin(buf);
     
       printf("Vous avez saisi \"%s\".\n", buf);
       return 0;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    il y a encore plus simple, pour le fgets ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ligne[strlen(ligne)-1] = '\0' ;

  16. #16
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Non, car si tu as tapé plus que le fgets() accepte, il n'y aura pas de \n dans le buffer.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  17. #17
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par souviron34
    il y a encore plus simple, pour le fgets ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ligne[strlen(ligne)-1] = '\0' ;
    Non, il faut tester au préalable que la ligne n'a pas été tronquée par fgets().

    EDIT: OUPS! Pardon, Médinoc, j'avais pas lu ta réponse.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  18. #18
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par souviron34
    il y a encore plus simple, pour le fgets ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ligne[strlen(ligne)-1] = '\0' ;
    Ben non. C'est pas parce que c'est simple que c'est correct.

    Si il n'y a pas de '\n', tu supprimes un caractère utile. De plus, tu ne purges rien et le prochaine saisie est non blocante. Le syndrome du scanf() du Diable est revenu...

    Le code publié par Medinoc n'est pas le fruit du hasard. C'est au contraire la synthèse d'années de reflexion et de remarques sur le sujet... Et ce n'est pas moi qui l'ai inventé, il provient plus ou moins de [f.]c.l.c.

    Personnellement, je prends le problème à la source et je réécris la fonction de saisie de ligne à base de fgetc(). C'est ce que j'enseigne à mon élève actuel (15 ans, débutant), et il s'en sort très bien.
    Pour le moment, il m'a sorti ça :
    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
    24
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
        int x = 0, i = 0;
        char chaine[20];
        chaine[0] = '\0';
        do
        {
            x = fgetc(stdin);
            if (i < 19 && x != '\n')
            {
                chaine[i] = x;
                i++;
            }
        }
        while (x != '\n');
        chaine[i] = '\0';
        printf("Voici la chaine:\n");
        printf("'%s'\n", chaine);
        return 0;
    }
    Il y a une ligne inutile, mais c'est pas grave.

    Prochaine étape, la mise en fonction. J'attends sa réponse...

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/06/2009, 18h33
  2. Réponses: 7
    Dernier message: 27/12/2008, 20h53
  3. [T-SQL] Comment égaliser un tuple et une chaîne vide en SQL ?
    Par clementratel dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/07/2008, 12h39
  4. SQL server 2005: conversion d'une chaîne vide en numerique.
    Par Marco24 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/04/2008, 11h35
  5. Erreur : Le champ ne peut pas être une chaîne vide
    Par supertoms dans le forum VBA Access
    Réponses: 5
    Dernier message: 23/04/2008, 07h05

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