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 :

Mon texte est-il un palindrome ?


Sujet :

C

  1. #21
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    Merci à vous tous pour ces éclaircissements et ces liens

    voici mon code fini et fonctionnel

    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
    37
    38
    39
    40
    41
    42
    43
    44
     
    #include <stdio.h>
    #include<string.h>
     
    int main (int argc, char **argv)
    {
        /*declaration des variables*/
        char mot [100];
        int i, j=-1, palindrome;
        palindrome = 1;
     
        /*saisie du texte*/
         scanf("%10[^\n]%*c", mot);
     
     
        /* conversion des majuscule en minuscule*/
        for(i=0;mot[i]!='\0';i++)
        {
            if(mot[i]>='A' && mot[i]<='Z')
                mot[i]=(mot[i]-'A')+'a';
      }
     
        /*>Supression des espaces*/
         for (i = 0; mot[i]; i++)
         if (mot[i] != ' ')
         mot[++j] = mot[i];
         mot[++j] = '\0';
     
        /*comparaison*/
         for (i = 0, j = strlen (mot) - 1; i <= j; ++i, --j)
         {
         if (mot[i] != mot[j])
         palindrome = 0;
         break;
         }
     
         /*resolution*/
         if (palindrome == 1)
         printf ("%s est un palindrome\n", mot);
         else
         printf ("%s n'est pas un palindrome\n", mot);
     
         return 0;
    }
    si vous lui trouvez des améliorations sans partir dans du trop complexe pour débutant je suis à votre écoute

  2. #22
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Quelques remarques :
    • l'indentation n'est pas bonne
    • tu devrais systématiquement mettre les accolades autour des for, if et autres pour plus de sécurité
    • tu pourrais déclarer les compteurs de boucle dans le for() directement pour plus de lisibilité (ce n'est pas grave de définir plusieurs compteurs s'appelant i et j dans différents for())
    • tu peux utiliser des commentaires // pour des commentaires sur une seule ligne pour plus de praticité (surtout si tu veux commenter par la suite des blocs en entier)
    • tu ne devrais pas utiliser scanf() mais fgets() pour plus de sécurité
    • palindrome devrait être un booléen (ou un type énuméré, ou avec un int avec des #define pour identifier les valeurs possibles) plutôt qu'un int aux valeurs brutes pour plus de lisibilité


    PS : quand tu n'auras plus de question, n'oublie pas de cliquer sur le bouton en bas de l'écran

    PS2 : je me demande si tu n'as pas un bug :
    radar radar
    radarrada n'est pas un palindrome
    
    Process returned 0 (0x0)   execution time : 24.650 s
    Press any key to continue.
    
    Le dernier 'r' se perd et le résultat est faussé.

    J'ai des warnings à la compilation de ton code :
    D:\Users\pgradot\Documents\C\formatting.c||In function 'main':|
    D:\formatting.c|20|warning: conversion to 'char' from 'int' may alter its value [-Wconversion]|
    D:\formatting.c|30|warning: conversion to 'int' from 'size_t' may change the sign of the result [-Wsign-conversion]|
    D:\formatting.c|5|warning: unused parameter 'argc' [-Wunused-parameter]|
    D:\formatting.c|5|warning: unused parameter 'argv' [-Wunused-parameter]|
    ||=== Build finished: 0 errors, 4 warnings (0 minutes, 0 seconds) ===|
    
    Mais je compile un peu fort :
    mingw32-gcc.exe  -g  -Wshadow -pedantic -Wextra -Wall -std=c99 -Wwrite-strings -Wconversion

  3. #23
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    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 630
    Points : 10 556
    Points
    10 556
    Par défaut
    C'est surtout le break dans ta boucle for qui me semble suspicieux
    Parce que n'ayant pas mis d'accolade pour ton if alors il ne doit y avoir qu'une seule ligne de code de prise pour la condition true.
    Et donc tu "breakes" à chaque tour de boucle et

    Rajoute ton booléen dans la condition de ta boucle for: c'est le plus simple

  4. #24
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    exact j'ai retiré le break il ne servait à rien

    Citation Envoyé par Bktero Voir le message
    Quelques remarques :
    • l'indentation n'est pas bonne
    • tu devrais systématiquement mettre les accolades autour des for, if et autres pour plus de sécurité
    • tu pourrais déclarer les compteurs de boucle dans le for() directement pour plus de lisibilité (ce n'est pas grave de définir plusieurs compteurs s'appelant i et j dans différents for())
    • tu peux utiliser des commentaires // pour des commentaires sur une seule ligne pour plus de praticité (surtout si tu veux commenter par la suite des blocs en entier)
    • palindrome devrait être un booléen (ou un type énuméré, ou avec un int avec des #define pour identifier les valeurs possibles) plutôt qu'un int aux valeurs brutes pour plus de lisibilité
    j'ai tenu compte de tout cela pour refaire mon code je vais le mettre à la fin, si tu peux me dire si j'ai bien compris

    Citation Envoyé par Bktero Voir le message
    Quelques remarques :
    tu ne devrais pas utiliser scanf() mais fgets() pour plus de sécurité
    en remplacant scanf part fgets j'ai un message d'erreur
    too many arguments to function 'fgets'




    Citation Envoyé par Bktero Voir le message
    Quelques remarques :

    PS2 : je me demande si tu n'as pas un bug :
    radar radar
    radarrada n'est pas un palindrome
    
    Process returned 0 (0x0)   execution time : 24.650 s
    Press any key to continue.
    
    Le dernier 'r' se perd et le résultat est faussé.
    erreur laisser lors de mes test, car j'avais laisser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char mot [100];
     
        /*saisie du texte*/
         scanf("%10[^\n]%*c", mot);
    du coup un texte de plus de 10 caractères, espace compris, plante


    Citation Envoyé par Bktero Voir le message
    Quelques remarques :

    J'ai des warnings à la compilation de ton code :
    D:\Users\pgradot\Documents\C\formatting.c||In function 'main':|
    D:\formatting.c|20|warning: conversion to 'char' from 'int' may alter its value [-Wconversion]|
    D:\formatting.c|30|warning: conversion to 'int' from 'size_t' may change the sign of the result [-Wsign-conversion]|
    D:\formatting.c|5|warning: unused parameter 'argc' [-Wunused-parameter]|
    D:\formatting.c|5|warning: unused parameter 'argv' [-Wunused-parameter]|
    ||=== Build finished: 0 errors, 4 warnings (0 minutes, 0 seconds) ===|
    
    Mais je compile un peu fort :
    mingw32-gcc.exe  -g  -Wshadow -pedantic -Wextra -Wall -std=c99 -Wwrite-strings -Wconversion

    heu je suis pas encore assez callé pour tout ces warning
    disons que je suis déjà content que ça fonctionne





    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
     
    #include <stdio.h>
    #include<string.h>
    #include<stdbool.h>
     
    int main (int argc, char **argv)
    {
        //declaration de variable
        char mot [100];
     
        //saisie du texte
         scanf("%100[^\n]%*c", mot);
        // conversion des majuscule en minuscule
    {    int i, j=-1;
         for(i=0;mot[i]!='\0';i++)
         {
             if(mot[i]>='A' && mot[i]<='Z')
             mot[i]=(mot[i]-'A')+'a';
         }
    }
     
        //Supression des espaces
    {
         int i, j=-1;
         for (i = 0; mot[i]; i++)
         if (mot[i] != ' ')
         mot[++j] = mot[i];
         mot[++j] = '\0';
    }
     
        //comparaison
    {
        int i, j=-1;
        bool palindrome=true;
        for (i = 0, j = strlen (mot) - 1; i <= j; ++i, --j)
        {
            if (mot[i] != mot[j])
            palindrome = false;
        }
     
         //resolution
        {
            if (palindrome == true)
            printf ("%s est un palindrome\n", mot);
            else
            printf ("%s n'est pas un palindrome\n", mot);
        }
    }
         return 0;
    }

    voila je reste à votre écoute pour d'autre correction
    merci

  5. #25
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bosk1000 Voir le message
    j'ai tenu compte de tout cela pour refaire mon code je vais le mettre à la fin, si tu peux me dire si j'ai bien compris
    TU n'as pas corrigé l'indentation et surtout tu as fait n'importe quoi avec les accolades !!!
    Quand je parlais de les mettre, je parlais de faire quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(int i = 0; i < 10; i++)
    {
        // Code
    }

    Citation Envoyé par bosk1000 Voir le message
    en remplacant scanf part fgets j'ai un message d'erreur
    too many arguments to function 'fgets'
    Peut-être qu'il aurait fallu comprendre pourquoi. Ca aurait pu te servir pour la suite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fgets(mot, 100, stdin);
    Voir le manuel de la fonction : http://www.cplusplus.com/reference/cstdio/fgets/


    Citation Envoyé par bosk1000 Voir le message
    erreur laisser lors de mes test, car j'avais laisser
    du coup un texte de plus de 10 caractères, espace compris, plante
    Ah ok j'ai pas fait gaffe


    Citation Envoyé par bosk1000 Voir le message
    heu je suis pas encore assez callé pour tout ces warning
    disons que je suis déjà content que ça fonctionne
    Oui, laisse couler pour le moment.


    Citation Envoyé par bosk1000 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        //Supression des espaces
    {
         int i, j=-1;
         for (i = 0; mot[i]; i++)
         if (mot[i] != ' ')
         mot[++j] = mot[i];
         mot[++j] = '\0';
    }
    Par exemple ici, je dois réfléchir quelques secondes pour savoir si la dernière ligne fait partie de la boucle ou pas. C'est bien plus clair comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        int j = -1;
        for (int i = 0; mot[i]; i++)
        {
            if (mot[i] != ' ')
            {
                mot[++j] = mot[i];
            }
        }
        mot[++j] = '\0';

  6. #26
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Par exemple ici, je dois réfléchir quelques secondes pour savoir si la dernière ligne fait partie de la boucle ou pas. C'est bien plus clair comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        int j = -1;
        for (int i = 0; mot[i]; i++)
        {
            if (mot[i] != ' ')
            {
                mot[++j] = mot[i];
            }
        }
        mot[++j] = '\0';
    Lorsque j'utilise ta méthode
    j'obtiens un code d'erreur
    'for' loop initial declarations are only allowed in c99 mode
    mettre le int i dans la parenthèse de for pose soucis car je dois utiliser c99 pour cela
    mais je pensais que c'est natif dans l'utilisation du logiciel
    j'utilise Qt creator
    pour utiliser le c99, dois-je utiliser un #include particulier ? ou y a t il une autre methode ?

  7. #27
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    En fait, il s'agit de dire au compilateur d'utiliser ce mode de compilation.

    Normalement, tout compilateur moderne l'utilise par défaut.
    avec gcc ca serait -std=C99. (quoiqu'on préferera -std=C11)

    Le fait que ton compilateur ne le comprenne pas est soit signe que ton projet est configuré pour du très vieux code, soit que tu as une vieille version.
    regarde si tu ne pourrais pas faire une mise à jour de QtCreator
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  8. #28
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bosk1000 Voir le message
    Lorsque j'utilise ta méthode
    j'obtiens un code d'erreur
    'for' loop initial declarations are only allowed in c99 mode
    mettre le int i dans la parenthèse de for pose soucis car je dois utiliser c99 pour cela
    mais je pensais que c'est natif dans l'utilisation du logiciel
    j'utilise Qt creator
    pour utiliser le c99, dois-je utiliser un #include particulier ? ou y a t il une autre methode ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QMAKE_CFLAGS += -std=c99

    Il y a en effet différentes versions du langage C. C89 (dit aussi C90 ou C ANSI), C99, C11 (la plus récente) sont des normes ISO et sont celles que tu devrais utiliser pour écrire du code portable. Perso, j'utilise C99 parce que je ne me suis pas encore intéressé aux nouveautés de C11 ni à son support par les compilateurs. Il existe aussi des C non-standards, avec les extensions proposées par les compilateurs.

  9. #29
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    Merci,
    on vient de me donner la méthode pour passer en 99, je continue l'adaptation

    j'espère que l'indentation est plus pro ?
    par contre fgets() j'ai due mal car il conserve le retour à la ligne et je ne vois pas comment l'adapté
    mais ceci dit j'ai déjà pas mal avancé
    je suis personnellement assez satisfait du résultat

    si vous pouvez m'expliquez ou est mon erreur avec fgets, merci
    si vous voyez des erreurs dans l'indentation, que je corrige, encore merci
    après je vois rien a corrigé ??
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    #include <stdio.h>
    #include<string.h>
    #include<stdbool.h>
     
    int main (int argc, char **argv)
    {
        //declaration des variables
        char mot [100];
     
        //saisie du texte
        scanf("%100[^\n]%*c", mot);
        // fgets( mot,  100, stdin);
     
         // conversion des majuscule en minuscule
        {
     
            for(int i=0;mot[i]!='\0';i++)
            {
                if(mot[i]>='A' && mot[i]<='Z')
                mot[i]=(mot[i]-'A')+'a';
            }
        }
     
        //Supression des espaces
     
         int  j = -1;
            for (int i = 0; mot[i]; i++)
            {
                if (mot[i] != ' ')
                {
                    mot[++j] = mot[i];
                }
            }
            mot[++j] = '\0';
     
     
     
        //comparaison
        {
        int  j;
        bool palindrome=true;
            for (int i = 0, j = strlen (mot) - 1; i <= j; ++i, --j)
            {
                if (mot[i] != mot[j])
                {
                    palindrome = false;
                }
            }
     
         //resolution
            {
            if (palindrome == true)
            printf ("%s est un palindrome\n", mot);
            else
            printf ("%s n'est pas un palindrome\n", mot);
            }
        }
         return 0;
    }

  10. #30
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pour le coup du fgets(), il y a deux solutions:
    1. La plus dure, c'est de l'appeler en boucle sur un buffer dynamique qu'on réalloue à chaque fois, pour pouvoir saisir une chaîne de n'importe quelle longueur (du moment qu'elle tient en mémoire). Certaines plate-formes unixoïdes supportent une fonction getline() qui gèrent ça pour toi.
    2. La façon paresseuse, c'est de saisir dans un buffer de taille limitée, mais s'assurer au moins de nettoyer derrière soi:
      • Si la chaîne saisie tient dans le buffer, alors le \n s'y trouve: Il suffit de trouver le \n et le supprimer. Et comme c'est le dernier caractère de la chaîne, il suffit de l'écraser avec un caractère nul:
        Code C : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        /* Returns a nonzero value if found, zero if not. */
        int truncate_newline(char *str)
        {
        	int bRet=0;
        	if(str!=NULL)
        	{
        		char *pNewline = strchr(str, '\n');
        		if(pNewLine!=NULL)
        		{
        			bRet = 1;
        			*pNewLine = '\0';
        		}
        	}
        	return bRet;
        }
      • Si la chaîne ne tient pas dans le buffer passé à fgets(), ça veut dire que le restant de la chaîne est toujours dans le flux d'entrée. Y compris le \n. Pour éviter de fausser les saisies suivantes, il faut s'en débarrasser en lisant jusqu'au \n:
        Code C : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        7
        8
        /*Returns 0 if OK, a negative value if EOF.*/
        int fpurge(FILE *f)
        {
        	int c;
        	while((c=fgetc(f))!=EOF && c!='\n')
        	{ }
        	return (c==EOF ? -1 : 0);
        }
      • Ces deux traitements peuvent être joints par un test: Si l'on trouve le \n dans le buffer, c'est que la chaîne est complète (et il faut supprimer le \n); sinon, c'est que la chaîne dépasse et il faut nettoyer le flux d'entrée jusqu'à la fin de la ligne:
        Code C : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        7
        8
        9
        /* Returns 0 if buffer is full, a positive value if line is complete,
           a negative value if EOF (implies buffer full). */
        int fclean(char *str, FILE *f)
        {
        	int ret = 1;
        	if(!truncate_newline(str))
        		ret = fpurge(f);
        	return ret;
        }
      • Ainsi, il suffit d'appeler cette dernière fonction après chaque fgets(), et hop on a la version "paresseuse" qui marche:
        Code C : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        char buf[100];
        fgets(buf, 100, stdin);
        fclean(buf, stdin);
        /*utiliser la chaîne*/
    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.

  11. #31
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Si la chaîne saisie tient dans le buffer, alors le \n s'y trouve: Il suffit de trouver le \n et le supprimer. Et comme c'est le dernier caractère de la chaîne, il suffit de l'écraser avec un caractère nul:
    j'avoue me sentir bien nul, à la lecture de tes explications

    Si j'ai bien compris ce que j'ai fait, mon char de 100 devrait suffire pour que la saisie tienne dans le buffer.
    Par contre je ne comprends pas l'utilisation de ton code ni comment l'adapter

    mon code commence ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <stdio.h>
    #include<string.h>
    #include<stdbool.h>
     
    int main (int argc, char **argv)
    {
        //declaration des variables
        char mot [100];
     
        //saisie du texte
         fgets( mot,  100, stdin);
    donc ensuite je dois faire intervenir ton code ?

    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
     
    /* Returns a nonzero value if found, zero if not. */
    int truncate_newline(char *str)
    {
    	int bRet=0;
    	if(str!=NULL)
    	{
    		char *pNewline = strchr(str, '\n');
    		if(pNewLine!=NULL)
    		{
    			bRet = 1;
    			*pNewLine = '\0';
    		}
    	}
    	return bRet;
    }
    qui s'occuper de trouver l’élément \n

    mais comment dois-je l'adapter car je ne saisis pas comment l'intégrer

    ou ai-je mal compris le déroulement

  12. #32
    Invité
    Invité(e)
    Par défaut
    Question bête : as-tu bien lu le message de Médinoc jusqu'au bout ?
    Citation Envoyé par Médinoc Voir le message
    • Ainsi, il suffit d'appeler cette dernière fonction après chaque fgets(), et hop on a la version "paresseuse" qui marche:
      Code C : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      char buf[100];
      fgets(buf, 100, stdin);
      fclean(buf, stdin);
      /*utiliser la chaîne*/
    Citation Envoyé par bosk1000 Voir le message
    Si j'ai bien compris ce que j'ai fait, mon char de 100 devrait suffire pour que la saisie tienne dans le buffer.
    Tant que ta saisie ne dépassera pas 99 caractères + le '\0' final... oui. Le code de Médinoc ne change pas cette capacité de stockage, il gère juste la suppression dans le buffer clavier des caractères tapés en trop par rapport à cette capacité de 100 (rôle de fpurge) + la suppression du '\n' dans ton buffer (rôle de truncate_newline).

  13. #33
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    victoire

    j'ai trouvé ceci qui résout mon problème

    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
     
     
    #include <stdio.h>
    #include<string.h>
    #include<stdbool.h>
     
    int main (int argc, char **argv)
    {
        //declaration des variables
        char mot [100];
     
        //saisie du texte
        //scanf("%100[^\n]%*c", mot);
         fgets( mot,  100, stdin);
     
     
     
         //Après lecture...
     
         char * tmp = strchr( mot , '\n' );
     
         if( tmp ) *tmp = '\0';   //Si la chaine contient un '\n' on le remplace par '\0'
    et ça fonctionne

    merci à tous pour votre aide

  14. #34
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Merci de cliquer sur en bas de page si tu n'as plus de question

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Mon texte est pixelisé
    Par vocal94130 dans le forum Webdesign & Ergonomie
    Réponses: 2
    Dernier message: 22/12/2011, 20h35
  2. Mon texte n'est plus justifier
    Par mayite dans le forum Mise en forme
    Réponses: 3
    Dernier message: 13/08/2011, 13h25
  3. Mon image de fond est au dessus de mon texte
    Par herzak dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 27/06/2009, 14h50
  4. [Access] Mon application est détruite !!!
    Par mathias dans le forum Access
    Réponses: 4
    Dernier message: 26/06/2003, 14h14

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