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 :

Besoin de précision


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    étudiant
    Inscrit en
    Juillet 2019
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2019
    Messages : 23
    Par défaut Besoin de précision
    Bonjour je suis en ce moment entrain de lire le livre langage C norme ansi 2éme édition

    celui la https://www.amazon.fr/langage-2e-%C3.../dp/2100715771

    et j'arrive a un petit soucis

    Nom : Image-1.jpg
Affichages : 160
Taille : 297,5 Ko

    j'ai reproduis cette éxo et en le tapant rien ne s'affiche alors qu'il est censé écrire par exemple 1 1 2 si je met un caractère parce que 1 1 2 corresponds a une nouvelle ligne un mot 2 caractère ( Une lettre suivie d'un caractère de nouvelle ligne)

    du coup j'ai déplacer le printf une accolade au dessus pour qu'il rentre dans mon while et j'arrive a afficher des petite chose mais c'est bisard que dans le livre l'exemple ne marche pas ? ou bien c'est moi ? tenez mon 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    #include <stdio.h>
     
    #define DEDANS 1
    #define DEHORS 0 
     
    int main()
    {
    	int c;
    	int nl; 
    	int nm; 
    	int nc;
    	int etat;
     
    	etat = DEHORS;
    	nl = nm = nc = 0;
    	while ((c = getchar()) != EOF){
    		++nc;
    		if (c == '\n')
    			++nl;
    		if (c == ' ' || c == '\n' || c == '\t')
    			etat = DEHORS;
    		else if(etat == DEHORS){
    			etat = DEDANS;
    			++nm;
    		}
    		printf("%d %d %d\n", nl, nm, nc);
    	}
    }
    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Le printf se fait une fois sorti de la boucle.
    Pour sortir de la boucle, il faut avoir lu EOF (fin de fichier).
    Pour que la console signale une fin de fichier, il faut taper le caractère Ctrl-D (où sous Windows c'est le caractère Ctrl-Z en début de ligne.)

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par dalfab Voir le message
    Pour sortir de la boucle, il faut avoir lu EOF (fin de fichier).
    Petite précision: on ne "lit pas" EOF car ce n'est pas un truc qui se trouve dans le fichier.
    C'est la fonction getchar() qui, quand elle ne lit plus rien dans le flux, renvoie alors d'elle-même une valeur particulière EOF (plus prosaïquement -1) indiquant alors que la fin de fichier a été atteinte.
    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]

  4. #4
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par défaut
    Bonjour,

    getchar() lit l'entrée standard. Le plus simple pour les tests serait de rediriger le contenu d'un fichier vers l'entrée standard.

    Exemple : exécuter "a.exe" en redirigeant le contenu du fichier "test.txt" vers l'entrée standard de "a.exe" :
    • Sur Windows : type test.txt | a.exe
    • Sur Linux : cat test.txt | a.exe


    À part ça, je vois que ce livre encourage de mauvaises pratiques. Par exemple, il faut éviter de mettre partout des noms de variables abrégés comme nl et nm, car c'est illisible.

    Voici une version moins moche du code du livre :

    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
    #include <stdio.h>
     
    typedef enum Etat {
    	Dans_mot,
    	Hors_mot
    } Etat;
     
    int main()
    {
    	int nb_lignes = 0; 
    	int nb_mots = 0; 
    	int nb_carac = 0;
    	Etat etat = Hors_mot;
    	int carac;
    	while((carac = getchar()) != EOF) {
    		++nb_carac;
    		if(carac == '\n')
    			++nb_lignes;
    		if(carac == ' ' || carac == '\n' || carac == '\t') {
    			etat = Hors_mot;
    		} else if(etat == Hors_mot) {
    			etat = Dans_mot;
    			++nb_mots;
    		}
    		printf("%d %d %d\n", nb_lignes, nb_mots, nb_carac);
    	}
    }

  5. #5
    Membre averti
    Homme Profil pro
    étudiant
    Inscrit en
    Juillet 2019
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2019
    Messages : 23
    Par défaut
    Yes merci c'est beaucoup plus clair

    oui le livre date d'un bon moments quand même

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

Discussions similaires

  1. [SOAP] besoin de précision
    Par Louis-Guillaume Morand dans le forum Services Web
    Réponses: 1
    Dernier message: 05/03/2007, 21h10
  2. [POO Basique] Besoin de précision sur une notion de base
    Par alois.cochard dans le forum Langage
    Réponses: 8
    Dernier message: 15/09/2006, 09h01
  3. tableau mutlidim, besoin de précision
    Par tuxout dans le forum Général JavaScript
    Réponses: 19
    Dernier message: 25/08/2006, 11h36
  4. [VB.NET]Besoin de précision pour architecture 3-tiers
    Par Dnx dans le forum Windows Forms
    Réponses: 8
    Dernier message: 14/09/2005, 09h09
  5. Besoin de précision sur TThread
    Par psau dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/02/2005, 23h35

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