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 :

Débutant, code défectueux


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    neant
    Inscrit en
    Juin 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : neant

    Informations forums :
    Inscription : Juin 2019
    Messages : 5
    Par défaut Débutant, code défectueux
    Bonjour,
    J'ai récemment commencé à étudier la programmation en C avec le livre : le langage C 2 ème édition de KERNIGHAN et RITCHIE.
    J'ai beau recopier les code fourni dans le livre ça ne fonctionne pas.
    Quand je tape EOF ça n'arrête pas la boucle while.

    Pouvez vous me dire si c'est une erreur d'écriture du livre ou bien si ça vient de moi et mon éditeur de texte svp?
    Merci

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include<stdio.h>
     
    int main() {
        int c;
        c = getchar();
        while (c != EOF) {
            putchar(c);
            c = getchar();
        }
    }

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 811
    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 811
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par macmad Voir le message
    Quand je tape EOF ça n'arrête pas la boucle while.
    EOF n'est pas un texte à taper (sinon la comparaison serait écrite différemment vu que ce serait une chaine) ; c'est une valeur spéciale (valant en réalité -1) qui est renvoyée par la fonction getchar() quand il n'y a plus rien à lire.
    Pour clore la saisie clavier, tu tapes "ctrl-D" (*) ce qui fera en sorte que le clavier sera considéré comme "fermé" ce qui amènera getchar() à renvoyer la valeur EOF.

    Et on place ses codes entre balises pour qu'ils soient affichés comme "code" par le forum

    (*) "ctrl-D" ce n'est pas non plus une chaine mais une combinaison de touches
    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]

  3. #3
    CGi
    CGi est déconnecté
    Expert confirmé
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    Détails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par défaut
    EOF n'est pas une suite de trois caractères, mais une macro, (End Of File)
    Il serait donc préférable de trouver une autre solution pour arrêter ta boucle.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  4. #4
    Futur Membre du Club
    Homme Profil pro
    neant
    Inscrit en
    Juin 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : neant

    Informations forums :
    Inscription : Juin 2019
    Messages : 5
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    EOF n'est pas un texte à taper (sinon la comparaison serait écrite différemment vu que ce serait une chaine) ; c'est une valeur spéciale (valant en réalité -1) qui est renvoyée par la fonction getchar() quand il n'y a plus rien à lire.
    Pour clore la saisie clavier, tu tapes "ctrl-D" (*) ce qui fera en sorte que le clavier sera considéré comme "fermé" ce qui amènera getchar() à renvoyer la valeur EOF.

    Et on place ses codes entre balises pour qu'ils soient affichés comme "code" par le forum

    (*) "ctrl-D" ce n'est pas non plus une chaine mais une combinaison de touches

    MERCI pour ta réponse, super rapide en plus ;-)
    ok pour le EOF, et effectivement ça marche mieux comme ça.
    Je risque de vous poser d'autres questions comme ça....

    ok pour les balises, vu l'onglet débutant en C ... pas malin j'aurais dû le lire plutôt...

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 811
    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 811
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par macmad Voir le message
    Je risque de vous poser d'autres questions comme ça....
    Pas de souci, on est là pour ça.
    Voici ton code un peu optimisé....
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include<stdio.h>
     
    int main() {
    	int c;
    	while ((c=getchar()) != EOF) {
    		putchar(c);
    	}
    }
    En mettant c=getchar() directement dans l'évaluation on évite de le répéter.
    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]

  6. #6
    Futur Membre du Club
    Homme Profil pro
    neant
    Inscrit en
    Juin 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : neant

    Informations forums :
    Inscription : Juin 2019
    Messages : 5
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Pas de souci, on est là pour ça.
    Voici ton code un peu optimisé....
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include<stdio.h>
     
    int main() {
    	int c;
    	while ((c=getchar()) != EOF) {
    		putchar(c);
    	}
    }
    En mettant c=getchar() directement dans l'évaluation on évite de le répéter.
    Oui dans le bouquin ils enchaînent comme ton code.👍
    Merci.

  7. #7
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 750
    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 750
    Par défaut
    Il faut lire la documentation EOF - End-of-File (stdio.h) (<- lien cplusplus.com en anglais)

    attention, c'est 1 documentation C++ : donc les entêtes C XXX.h deviennent en C++ cXXX (sans extension) (stdio.h -> cstdio, stdlib.h -> cstdlib, …)

  8. #8
    Futur Membre du Club
    Homme Profil pro
    neant
    Inscrit en
    Juin 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : neant

    Informations forums :
    Inscription : Juin 2019
    Messages : 5
    Par défaut
    Ok...merci

  9. #9
    Membre chevronné
    Homme Profil pro
    très occupé
    Inscrit en
    Juillet 2014
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : très occupé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 137
    Par défaut
    Ctrl-D renvoie EOF en principe sous Linux ou un Unix. Sous Windows EOF est normalement la combinaison Ctrl-Z.

    https://stackoverflow.com/questions/...n-the-terminal

  10. #10
    Membre chevronné
    Homme Profil pro
    très occupé
    Inscrit en
    Juillet 2014
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : très occupé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 137
    Par défaut
    Les combinaisons de touches précitées permettent effectivement de simuler la fin du flux d'entrée dans le programme (le clavier selon la façon dont tu le lances probablement vu ta question).

    En fait, le K&R présente ce code dans la section "1.5.1 File Copying" en montrant que l'on peut faire des programmes surprenamment utiles juste avec les fonctions getchar() et putchar(), la raison étant que tu peux réellement copier des fichiers avec ce programme en le lançant comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $ gcc -Wall -Wextra macmad.c -o copy-program
    $ ./copy-program < original_file > copied_file
    (sous Linux et autres systèmes de type Unix)

    En le lançant ainsi, tu diriges le contenu du fichier "original_file" vers ton programme qui en lira le contenu sur l'entrée standard et tu rediriges la sortie standard sur "copied_file".

    Le programme rencontre EOF tout seul lorsque le contenu du fichier "original_file" est épuisé.

    La gestion des fichiers est faite par le shell.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    neant
    Inscrit en
    Juin 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : neant

    Informations forums :
    Inscription : Juin 2019
    Messages : 5
    Par défaut
    Effectivement je suis sous linux.
    Ok, je vois mieux avec ton exemple l'utilisation qu'on peut en faire !!!

    Merci.

  12. #12
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 754
    Par défaut
    Citation Envoyé par -Eks- Voir le message
    En fait, le K&R présente ce code dans la section "1.5.1 File Copying" en montrant que l'on peut faire des programmes surprenamment utiles juste avec les fonctions getchar() et putchar(), la raison étant que tu peux réellement copier des fichiers avec ce programme en le lançant comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $ gcc -Wall -Wextra macmad.c -o copy-program
    $ ./copy-program < original_file > copied_file
    (sous Linux et autres systèmes de type Unix)
    Et cela fonctionne également en console windows:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    copy_program < original_file > copied_file

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. De la rapidité du code
    Par jfloviou dans le forum Contribuez
    Réponses: 233
    Dernier message: 29/05/2009, 02h17
  2. code pour interbase 6.0 et 6.5 de generateur
    Par tripper.dim dans le forum InterBase
    Réponses: 4
    Dernier message: 01/07/2002, 11h29
  3. [MFC](encapsulation ADO) ou placer le code
    Par philippe V dans le forum MFC
    Réponses: 2
    Dernier message: 13/06/2002, 14h58
  4. Explorateur de code C
    Par Zero dans le forum C
    Réponses: 14
    Dernier message: 06/06/2002, 09h41
  5. OmniORB : code sous Windows et Linux
    Par debug dans le forum CORBA
    Réponses: 2
    Dernier message: 30/04/2002, 17h45

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