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 :

Taper du texte


Sujet :

C

Vue hybride

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 32
    Par défaut Taper du texte
    Salut, voilà mon programme :

    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
    #include <stdio.h>
    #include <stdlib.h>
    int main()  
    {
    char texte_tape[80];
     
    printf ("");
    gets (texte_tape);
     
     
     
     
    FILE *cr = fopen("c:\\essai.txt","w");                                       
    fprintf (cr,texte_tape);  
    fclose (cr);     
     
    return 0;
    }
    Mais le problème est que je ne peux taper qu'une ligne,car quand j'appuie sur entrée, le programme est quitté au lieu d'allé à la ligne.J'aurais aimé savoir comment faire pour que je puisse tapé plusieurs ligne de texte?

    Merci pour votre aide :-)

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Par défaut
    Un systeme tout con pourrait etre de faire comme certains programmes sous unix, ils attendent une ligne avec un seul point pour s'arreter.
    Tu ecris donc ton texte et tu attends une ligne avec un point pour tarreter.

    Cependant je te conseillerais de faire attention, tu cree un buffer de 80 et tu ne le limite pas actuellement, renseigne toi sur les buffers overflow et autres problemes qui peuvent etre lier a cela.

    Bonne journee

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 32
    Par défaut
    Ca va merci pour ta réponse.
    Je vais étudier cela.

  4. #4
    Membre éclairé
    Avatar de odsen.s
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 269
    Par défaut
    Salut,

    Il ne faut jamais utiliser gets(). Voici un extrait de man gets :
    BOGUES
    N'utilisez jamais gets(). Comme il est impossible de savoir à l'avance
    combien de caractères seront lus par gets(), et comme celui-ci écrira
    tous les caractères lus, même s'ils débordent du tampon, cette fonction
    est extrèmement dangereuse à utiliser. On a déjà utilisé ce dysfonc-
    tionnement pour créer des trous de sécurité. UTILISEZ TOUJOURS fgets()
    À LA PLACE DE gets().
    Pour ton problème, je vois bien une lecture caractère par caractère grâce à fgetc(stdin) tant que le caractère lu n'est pas EOF.
    Attention à ne pas lire plus de caractères que le tableau ne peut en contenir.

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par odsen.s Voir le message
    Salut,

    Il ne faut jamais utiliser gets(). Voici un extrait de man gets :


    Pour ton problème, je vois bien une lecture caractère par caractère grâce à fgetc(stdin) tant que le caractère lu n'est pas EOF.
    Attention à ne pas lire plus de caractères que le tableau ne peut en contenir.
    Et au pire des cas, pour éviter les buffer overflow, tu peux faire un buffer alloué dynamiquement et faire une réallocation dynamique avec une croissance par progression géométrique: http://www.bourguet.org/realloc.pdf soit pour illustrer (merci à Jean-Marc.Bourguet en passant) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new_size=old_size + old_size/2
    Cela dit, si tu cherches à faire un programme ultra rapide et optimisé... les fonctions d'allocation sont parmis les plus lentes, même si pour toi cela reste rapide
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    Citation Envoyé par cetiop Voir le message

    Mais le problème est que je ne peux taper qu'une ligne,car quand j'appuie sur entrée, le programme est quitté au lieu d'allé à la ligne.J'aurais aimé savoir comment faire pour que je puisse tapé plusieurs ligne de texte?

    Merci pour votre aide :-)
    Bon, tout le monde est tellement concentré sur tes possibles buffer overflow que personne n'a pensé à te demander si tu savais ce qu'est une boucle.

    Si tu appliques ton code une fois, il s'exécute une fois. Si tu fais une boucle, il s'exécute boucle fois.

  7. #7
    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
    Une solution 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
    37
    38
    39
    40
    41
    42
    43
    44
    #include <stdio.h>
    #include <stdlib.h>
     
    #define LINE_LENGTH 80
    #define NB_LINES 10
     
    void check_and_clean(int c);
     
    int main(void)
    {
        char s_buffer[LINE_LENGTH * NB_LINES] = "";
        int c;
        int i; /* loop index */
     
        c = fgetc(stdin);
        for (i = 0; i < sizeof s_buffer -1 && c != EOF; i++)
        {
            s_buffer[i] = c;
            c = fgetc(stdin);
        }
        check_and_clean(c);
     
        printf("Vous avez entré:\n\n%s\n", s_buffer);
        return EXIT_SUCCESS;
    }
     
    /**
     * Vérifie si l'entrée a été tonquée et vide le tampon du flux d'entrée standard
     * si nécessaire.
     */
    void check_and_clean(int c)
    {
        if (c != EOF)
        {
            /* Le tampon est plein */
            fprintf(stderr, "Buffer is full, entry has been truncated...!\n");
     
            /* On vide le tampon d'entrée */
            while ((c = fgetc(stdin)) != '\n' && c != EOF)
            {
                continue;
            }
        }
    }
    Après, ça dépend pas mal de ce que tu veux faire. Pour une simple saisie multilignes avec une taille de tampon fixe, le code proposé ci-dessus fonctionne.

    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++

    +

  8. #8
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        char s_buffer[LINE_LENGTH * NB_LINES] = "";
    C'est plus prudent de mettre tout le buffer à \0 (avec une boucle ou avec memset).

    La dans ton code, tu ne met pas de \0 à la fin, donc le printf craque.

  9. #9
    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 Faiche Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        char s_buffer[LINE_LENGTH * NB_LINES] = "";
    C'est plus prudent de mettre tout le buffer à \0 (avec une boucle ou avec memset).

    La dans ton code, tu ne met pas de \0 à la fin, donc le printf craque.
    Oui,

    L'initialisation suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char s_buffer[LINE_LENGTH * NB_LINES] = "";
    est équivalente à:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char s_buffer[LINE_LENGTH * NB_LINES] = {0};
    qui initialise toute les cases du tampon à la valeur 0.

    Comme la boucle s'exécute seulement lorsque i est inférieur à sizeof s_buffer - 1, je ne vois pas où est problème. Le code proposé est sûr de ce point de vue.

    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++

    +

  10. #10
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    effectivement, je connaissais pas cette initialisation, sorrite :p

Discussions similaires

  1. Réponses: 10
    Dernier message: 17/04/2009, 20h20
  2. taper du texte en bleu dans un GtkTextView
    Par exhortae dans le forum GTK+ avec C & C++
    Réponses: 8
    Dernier message: 02/01/2008, 11h36
  3. Taper du texte sans textarea
    Par Kapha dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 06/09/2007, 14h30
  4. [Tableaux] Taper du texte sous DOS.
    Par kult dans le forum Langage
    Réponses: 16
    Dernier message: 17/11/2005, 15h06
  5. [debutant] taper un texte à l'aide de JButton
    Par debdev dans le forum Composants
    Réponses: 9
    Dernier message: 16/04/2005, 20h51

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