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 :

[Debutant] case '\r' :


Sujet :

C++

Vue hybride

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Par défaut [Debutant] case '\r' :
    Bonjour,
    je fais des exos de C++ avec un livre de 1991
    et dans ce livre,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    switch
    {
       case '\r' : //ou case '\n' :
       .......;
    }
    est censé réagir à -> appui sur 'entrée' <-
    Mais dans la réalité de Visual Studio 2005, il ne se passe rien.
    En parcourant le forum, j'ai cru comprendre qu'il y avait une histoire d'ASCII 13 pour entrée ? mais j'imagine qu'il faut insérer un fichier .h, ou ?
    N'y a-t-il pas une commande aussi simple que case '\r' ?

    De même, default ne tient pas compte de ' ' comme espace blanc, et case ' ' : n'est jamais validé..
    Je ne comprends pas

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Normalement dans un switch, il y a une expression entre parenthèses. C'est à cette expression que \r doit être comparé.

    Et il est probable que cette expression contienne un appel à la fonction non-standard getch(), qui permet de saisir au vol n'importe quelle touche, alors que les fonctions standard ne réagissent qu'après un appui sur [entrée] pour terminer la ligne en cours.
    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.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    Si tu veux apprendre le C++, tu devrais regarder des livres C++ plus récents ( voir sur le site, et regarde la FAQ déjà par exemple )

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Par défaut
    Je me suis plantée dans ma question -> swich (ch)
    Donc ça, c'est un truc un peu archaïque, histoire de compter le nombre de 'ss', 'sa' et 'se' dans un texte.

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    #include "stdafx.h"
    #include <iostream>
    #include <string.h>
    using namespace std;
     
    enum Comb {s='s', S='S', a='a', A='A', e='e', E='E'};
     
    void main()
    {
    	char ch;
    	int sCnt = 0, aCnt = 0, eCnt = 0,
    		ssCnt = 0, saCnt = 0, seCnt = 0;
    	int tmp = 0;
     
    	while (std::cin>>ch)
    	{
    		switch (ch)
    		{
    			case S :
    			case s :
    				if (sCnt == 1)
    				{
    					ssCnt++;
    					tmp = 1;
    				}
    				if ((sCnt == 0) && (tmp == 0))
    				{
    					sCnt++;
    				}
    				tmp = 0;
    				break;	
     
    			case a :
    			case A :
    				if (sCnt == 1)
    				{
    					saCnt++;
    					sCnt--;
    				}
    				break;
     
    			case e :
    			case E : 
    				if (sCnt == 1)
    				{
    					seCnt++;
    					sCnt--;
    				}
    				break;
     
    			case ' ': //MARCHE PAS
    				sCnt = 0;
    				break;
     
    			default :
    				sCnt = 0;
    				break;
     
    			case '=' :
    			/*case VK_RETURN :*/
    				std::cout<<endl<<"ss = "<<ssCnt;
    				std::cout<<endl<<"sa = "<<saCnt;
    				std::cout<<endl<<"se = "<<seCnt<<endl;
    				sCnt = 0;
    				ssCnt = 0;
    				saCnt = 0;
    				seCnt = 0;
    				break;
    		};
    	}
    }
    Pour la phrase "Seule dans sa forêt, la salamandre tisse."
    ss = 2
    sa = 2
    se = 2
    Ca marche.. Mais avec 2 problèmes :
    - "danS Sa" est compté comme ss -> l'espace entre n'est pas pris en compte
    par "default", ni par case ' ' :
    - Pour avoir le résultat, il faut que je fasse '=' + 'Enter'..
    Du coup, j'ai essayé avec VK_RETURN, mais j'obtiens :
    VK_RETURN : undeclared identifier.
    Voilà... Je sais pas si c'est beaucoup plus clair là..

    Mais.. : Non, ça ne sert à rien, c'est juste un exercice ^^

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    C'est normal, cin>>char utilise des règles assez spéciale pour la lecture de caractère. En gros par défaut ça saute les caractères "blancs" (espace, retour à la ligne, tabulation,...).
    Il y a un gros pavé dans la faq pour tuner les flux C++.
    Néanmoins, pour être honnète avec toi, je n'ai jamais compris l'utilité de ce genre de réglage . Alors en général j'utilise getline(cin,un_string) et je lis ligne par ligne.
    Sinon:
    - ton enum la, c'est assez limite comme bidule.
    - un \r ne doit normalement jamais se retrouver dans une chaine de caractère C ou C++, c'est le second caractère utilisé exclusivement dans les fichiers windows après le classique \n, mais il disparait lors d'une utilisation en mémoire. On ne devrait s'en servir que dans le cas où on est confronté à un mauvais encodage.
    - crois tu vraiment que ce soit nécessaire de faire des pieds et des mains pour utiliser un switch à tout prix? Imagine que tu doives identifier n'importe quelle lettre de l'alphabet, tu vas taper 2x26 cases? Une suite de if/else if/else est plus lisible, plus naturel et est tout aussi optimisé qu'un switch (quoi que quand tu déclare plein de cases inutiles, ça peut même l'être plus). Cette structure ne devrait être utilisée quand dans le cas d'enums justifiés.
    - je ne sais plus si c'est obligatoire, mais par convention le case default on le met toujours à la fin.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Par défaut
    Merci bcp zais_ethael pour ces précieuses explications.

    J'ai utilsé getline, ça fonctionne et c'est plus clair maintenant :
    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
     
    #include "stdafx.h"
    #include <iostream>
    #include <string>
    using namespace std;
     
    void main()
    {
    	begin :
    	char cinput[100];
    	int sCnt = 0 , saCnt = 0 , seCnt = 0, ssCnt = 0;
    	std::cout << "Enter anything: "<<endl;
    	std::cin.getline(cinput,50); 
     
    	for (int i =0; i<= 100; i++)
    	{
    		if ((cinput[i] == 's')||(cinput[i] == 'S'))
    		{
    			sCnt = 1;
    			i++;
    			if ((cinput[i] == 'a')||(cinput[i] == 'A'))
    			{
    				saCnt++;
    				sCnt = 0;
    			}
    			if ((cinput[i] == 'e')||(cinput[i] == 'E'))
    			{
    				seCnt++;
    				sCnt = 0;
    			}
    			if ((cinput[i] == 's')||(cinput[i] == 'S'))
    			{
    				ssCnt++;
    			}
    			i--;
    		}
    	}
    	std::cout <<"sa ="<< saCnt <<endl<<"se ="<< seCnt <<endl<<"ss ="<< ssCnt <<endl;
    	goto begin;
    }
    Je suis encore loin des class template, des structures et de la récursivité, mais... Un jour peut-être

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

Discussions similaires

  1. [Debutant] Case à cocher & source de données.
    Par ylarvor dans le forum IHM
    Réponses: 2
    Dernier message: 07/01/2008, 13h35
  2. [Debutant] Case à cocher. . .
    Par nicou50 dans le forum Access
    Réponses: 7
    Dernier message: 04/09/2006, 11h20
  3. debutant besoin de cibler chaque case de ma grille
    Par nassimmm dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 27/07/2006, 19h37
  4. [Débutant] Case à cocher
    Par Glixer dans le forum Access
    Réponses: 6
    Dernier message: 22/05/2006, 10h21
  5. [Debutant] URL utilisable depuis une case d'un tableau de BD
    Par Marc_3 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 03/04/2005, 19h06

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