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

  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

  11. #11
    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
    Avant de commencé, je tiens à vous remercier d'avoir pris du temps pour mon problème.
    Pour préciser, je débute en c donc pour le buffer et tout c'est un peu chaud!
    Par contre pour les boucles, j'ai fait un "do- while".
    Si quelqu'un à une meilleur solution je suis preneur.

    J'ai d'autres questions aussi,est-ce que c'est possible de faire ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (texte = "oui")
    {
    instruction}
    else{
    instruction}
    En gros, selon ce que l'on tape au clavier, ca fait tel ou tel chose.
    J'ai essayé de faire ca , mais sans grands succès.

    De plus j'ai voulu mettre un peu des couleurs,
    j'ai utilisé:

    et Mais ca marche pas, je suis sous dev c++ 4.9.9.2.J'ai fait appel au header :
    .

    Merci pour votre aide.

  12. #12
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (texte = "oui")
    Il faudrait que tu lises le cours sur les chaines de caractères avant de te lancer dedans, parce que si on te fait le code a chaque fois, tu ne comprendras jamais comment ça marche.

    Indice : ici, tu as doublement tort

  13. #13
    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
    lol ok merci.

  14. #14
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    J'ai d'autres questions aussi,est-ce que c'est possible de faire ca :
    La comparaison de chaînes de caractères se fait avec la fonction strcmp. Conférer un post encore tout récent sur le sujet.
    http://www.developpez.net/forums/sho...d.php?t=402628

  15. #15
    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 cetiop Voir le message
    Avant de commencé, je tiens à vous remercier d'avoir pris du temps pour mon problème.
    Pour préciser, je débute en c donc pour le buffer et tout c'est un peu chaud!
    Par contre pour les boucles, j'ai fait un "do- while".
    Si quelqu'un à une meilleur solution je suis preneur.

    J'ai d'autres questions aussi,est-ce que c'est possible de faire ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (texte = "oui")
    {
    instruction}
    else{
    instruction}
    [...]
    Merci pour votre aide.
    En C, l'opérateur d'égalité pour des entiers est '==' et non '='. Pour comparer des chaînes de caractères, on utilise la fonction strcmp() fournie par la bibliothèque standard et déclarée dans le fichier d'en-tête string.h. Cela donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if ( strcmp(texte, "oui" ) == 0 )
    {
         /* ton code */
    }
    En qui concerne les fonctions de conio.h, je ne peux pas t'aider, car je n'ai jamais utilisé cette bibliothèque. Au passage, il existe une alternative portable à conio: PDCurses.

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

    +

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