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 :

De string � code ASCII


Sujet :

C++

  1. #1
    Membre confirm�
    Homme Profil pro
    retrait�
    Inscrit en
    Septembre 2010
    Messages
    116
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : retrait�
    Secteur : B�timent Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Par d�faut De string � code ASCII
    Salut � tous,
    Comment, SVP, obtenir le code ASCII de la lettre extraite dans ce bout de code?
    D'apr�s la FAQ, j'ai cru comprendre qu'il fallait d'abord convertir cette lettre en 'char', mais je n'ai pas compris l'explication ni l'exemple qui est donn�.

    Merci d'avance.
    L.P.
    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
     
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
        string str("Hello");
        string sub = str.substr(1,1); // Extraction de la deuxieme lettre seulement
    // Ici je souhaiterais obtenir le code ASCII de la lettre extraite ci- dessus
     
        cout << sub << endl;
     
        return 0;
    }

  2. #2
    Membre �clair� Avatar de supaplex
    Homme Profil pro
    D�veloppeur en syst�mes embarqu�s
    Inscrit en
    Avril 2012
    Messages
    47
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activit� : D�veloppeur en syst�mes embarqu�s

    Informations forums :
    Inscription : Avril 2012
    Messages : 47
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
        string str("Hello");
        string sub = str.substr(1,1); // Extraction de la deuxieme lettre seulement
    // Ici je souhaiterais obtenir le code ASCII de la lettre extraite ci- dessus
     
        cout << int(sub[0]) << endl;
     
        return 0;
    }

  3. #3
    Expert confirm�
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    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 772
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
        string str("Hello");
        const char* ascii_str = str.c_str();
     
        if ((str.length() > 1) && (ascii_str != NULL)) {
            printf("%d", ascii_str[1]);
        }

  4. #4
    Membre Expert
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par d�faut
    Comme tout le monde s'y met....

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <iostream>
    #include <string>
     
    int main()
    {
        std::string str("Hello");
        std::cout << int(sub[1]) << std::endl;
    }
    Au passage, il n'y a aucune raison d'utiliser substr.

  5. #5
    Membre confirm�
    Homme Profil pro
    retrait�
    Inscrit en
    Septembre 2010
    Messages
    116
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : retrait�
    Secteur : B�timent Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Par d�faut
    Salut � tous,
    Merci pour vos promptes r�ponses.
    J'ai h�te de les essayer toutes.
    Merci encore � Koala01 pour son message � propos des conditionnelles que j'ai d�couvert par hasard en 'postant' celui en cours.
    Je lui promets de faire l'exercice qu'il m'a donn� d�s que j'ai fini celui-l�.

    L.P.

  6. #6
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    Comme tu as eu plein de code, mais pas d'explications, en voici:

    la fonction string::substr retourne une string.
    l'op�rateur [] (string::operator[]) retourne un char.

    les op�rateurs << de ostream sont nombreux, le compilateur cherche le plus adapt� aux types des op�randes.
    Il trouve respectivement:
    1. operator << (ostream &, string const&), qui affiche la chaine complete
    2. ostream::operator << (char), qui affiche le caract�re


    Mais il en existe d'autres, potentiellement plus int�ressant. Par exemple, ostream::operator << (int), qui affiche un entier.
    La solution est donc de faire choisir celle-ci au compilateur, en convertissant le caract�re � afficher.

    Il y a plusieurs solutions, parmi:
    • le vieux cast � la C, qui est d�conseill�, voire d�pr�ci�: cout << (int) (str[1]) << endl;
    • la conversion "fonction style", c'est � dire la notation "constructeur de int": cout << int(str[1]) << endl;
    • la conversion explicite: cout << static_cast<int>(str[1]) << endl;

    Je recommande vivement cette derni�re: elle explicite parfaitement qu'on fait une conversion, et on peut rechercher facilement ce mot cl� static_cast (id�alement, je chercherai "_cast").


    Note que str.sub(1, 1)[0] retourne la m�me valeur que str[1] (� ceci pr�s que c'est une r�f�rence sur une copie du caract�re original).

  7. #7
    Membre confirm�
    Homme Profil pro
    retrait�
    Inscrit en
    Septembre 2010
    Messages
    116
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : retrait�
    Secteur : B�timent Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Par d�faut
    Salut � tous et en particulier � 'ternel' pour ses explications acad�miques.
    Pour situer le probl�me je dois dire si que jadis.. j'ai d�velopp� quelques applications de gestion en VBA exclusivement pour Excel et Access, je m'initie � peine (2 ou 3 semaines) � C++ avec pour support (en + du site, bien entendu) les livres: "Apprendre le C++", de Claude Delannoy et "Programmez avec le langage c++", de Mathieu Nebra et Matthieu Schaller.
    Je n'ai pas d�pass� la page 100 de chacun d'eux et je n'ai pas encore trouv� mes 'marques' avec l'�diteur Code::Blocks. Les choses d�cantent lentement.
    Je m'essaye � quelques exercices pour me familiariser avec la syntaxe mais,
    -le vieux cast � la C...
    -la conversion "fonction style"...
    -la notation "constructeur de int"...
    et
    -la conversion explicite...
    ne me parlent pas encore mais j'esp�re que �a va venir.
    En tous cas j'ai scrupuleusement recopi� toutes ces explications dont je ne doute pas que dans quelques mois elles me seront parfaitement famili�res.

    Merci encore.

    P.S.
    le code de 'foetus' ne s'est pas compil�. Il doit manquer un include quelque chose. C'est dommage car j'aurais bien voulu comprendre la conditionnelle qu'il a ajout�.

    L.P.

  8. #8
    Expert confirm�
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    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 772
    Par d�faut
    Citation Envoy� par luc pic Voir le message
    le code de 'foetus' ne s'est pas compil�. Il doit manquer un include quelque chose. C'est dommage car j'aurais bien voulu comprendre la conditionnelle qu'il a ajout�.
    Non, il te manque la notion de namespace

    Parce que faire un #include <iostream> n'est pas suffisant. La classe string (comme toutes les autres de la STL), font partie du namespace std: donc std::string.

    Sinon, mon test n'est pas sorcier contrairement � tout le monde, je teste s'il y a au moins 2 caract�res parce que si ta cha�ne est vide ou a un seul caract�re XXX[1] plante.
    L'autre test c'est juste pour v�rifier que la cha�ne C encapsul�e par la classe string a bien �t� retourn�e (du moins son pointeur).

  9. #9
    Membre confirm�
    Homme Profil pro
    retrait�
    Inscrit en
    Septembre 2010
    Messages
    116
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : retrait�
    Secteur : B�timent Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Par d�faut
    Salut � tous,
    C'est s�r que le test de 'foetus' est tr�s int�ressant parce que justement j'essaye des contr�les de saisie et pour l'instant c'est pas au top.

    Mais le journal de g�n�ration dit, entre autres choses:

    ||=== G�n�rer : Debug dans projet_02 (compilateur : GNU GCC Compiler) ===|
    .... projet_02\main.cpp|13|error: 'printf' was not declared in this scope|
    ||=== G�n�ration de �chou� : 1 erreur(s), 0 avertissement(s) (0 minute(s), 0 seconde(s)) ===|

    L.P.

    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
     
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
      string str("Hello");
        const char* ascii_str = str.c_str();
     
        if ((str.length() > 1) && (ascii_str != NULL)) {
            printf("%d", ascii_str[1]);
        }
        return 0;
    }

  10. #10
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    D�tails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par d�faut
    printf est une fonction de la biblioth�que C d�clar�e dans le header cstdio qui formate et envoie des informations sur la sortie standard. Remplace l'appel par l'idiome std::cout << que tu utilisais jusqu'� pr�sent.

  11. #11
    Membre confirm�
    Homme Profil pro
    retrait�
    Inscrit en
    Septembre 2010
    Messages
    116
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : retrait�
    Secteur : B�timent Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Par d�faut
    page 29 du Cours de C/C++ Par Christian Casteyde sur ce site, je viens de trouver un #include <stdio.h> qui r�sout le probl�me.
    Merci � tous.

  12. #12
    Expert confirm�
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    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 772
    Par d�faut
    Citation Envoy� par luc pic Voir le message
    page 29 du Cours de C/C++ Par Christian Casteyde sur ce site, je viens de trouver un #include <stdio.h> qui r�sout le probl�me.
    Merci � tous.
    Non surtouuuuuuuuuuuuuuut pas

    Lorsqu'on code en C++, toutes les ent�tes C ont �t� converties ainsi #include <XXX.h> -> #include <cXXX>.

    Par exemple, cstdio, csdtlib, ctime, ... La documentation officielle avec tout: printf

  13. #13
    Membre Expert
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par d�faut
    @foetus: std::string::c_str() retourne toujours une cha�ne valide, tester le pointeur est totalement inutile.

    @luc pic: les bouquins de Claude Delannoy ont mauvaises r�putations et le cours Mathieu Nebra et compl�tement � la ramasse, suffit de regarder le forum d'OC pour voir les reproches qui lui sont fait. Pour finir un cours qui t'enseigne C/C++ ne t'apprendra ni le C, ni le C++.
    Comme bon livre il y a C++ primer, 5e �dition de Lipmann

  14. #14
    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
    Personne ne propose simplement le .at( 2 ) ?

    Genre:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    std::string s{ "salut" };
    char c = s.at( 2 )
     
    if( c == 108 )
    {
       std::cout << "c'est un l" << std::endl;
    }
    Si tu veux tester �a suffit.

    C'est quand tu dois l'afficher avec std::cout que par d�faut il va falloir le caster en quelque chose d'autres que char, mais c'est juste une question d'affichage.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
      std::cout << static_cast< int >(c) << std::endl;

  15. #15
    Membre Expert
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par d�faut
    .at fait plus que tester la pr�sence de l'index, elle lance une exception s'il n'est pas disponible et crash m�chamment le programme avec une erreur incompr�hension pour l'utilisateur si l'exception n'est pas rattrap�e.

    PS: 108 -> 'l', plus lisible.

  16. #16
    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
    D'ailleurs, l'exception lanc�e par std::string::at est de type std::out_of_range qui d�rive de std::logic_error qui est un type d'exception qui sert normalement � rattraper une erreur de programmation.

    Doc de std::logic_error :
    � It reports errors that are a consequence of faulty logic within the program such as violating logical preconditions or class invariants and may be preventable. �

    std::logic_error et ses types d�riv�s se combinent bien avec assert :
    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
    #include <iostream>
    #include <string>
    #include <cassert>
     
    char premiereLettre(const std::string& nom)
    {
        assert(nom.length() > 0); // en Debug, arrête le programme si nom.length() == 0
        return nom.at(0); // lance une exception std::out_of_range si nom.length() == 0
    }
     
    int main() {
        try {
            std::string nom;
            char c = premiereLettre(nom);
            std::cout << "Premiere lettre : '" << c << "'.";
        } catch(std::logic_error& e) {
            std::cerr << "Erreur de programmation : " << e.what();  
        } catch(std::exception& e) {
            std::cerr << "Erreur : " << e.what();
        }
        return 0;
    }
    Si cela ne doit pas �tre consid�r� comme une erreur de programmation, alors il vaut mieux lancer un std::range_error qui d�rive de std::runtime_error :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    char premiereLettre(const std::string& nom)
    {
        if(nom.length() == 0)
            throw std::range_error("Un nom vide n'a pas de premiere lettre.");
        return nom[0];
    }

  17. #17
    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
    Ca crashe pas le programme, �a lance une exception, c'est quand m�me diff�rent.

    Je vois pas trop le probl�me d'utiliser �a par d�faut, quand on ne connait pas le domaine d'application du prog original.

    Pour moi, par d�faut, on utilise des exceptions et du safe et on �vite de tout g�rer (mal) � la main. Parce que si tu v�rifies jamais que ton indice est dans la string, l� oui �a crashe m�chant (ou pire, �a crashe pas).

  18. #18
    Membre confirm�
    Homme Profil pro
    retrait�
    Inscrit en
    Septembre 2010
    Messages
    116
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : retrait�
    Secteur : B�timent Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Par d�faut
    Salut � tous,
    Et merci � Matt, hier nos envois se sont crois�s.
    Effectivement en rempla�ant 'printf' par 'cout' c'est ok et la conditionnelle de foetus est imp�cable.
    Je mets de cot� le .at(2) de nikko pour plus tard. J'ai un peu de mal � faire le tri dans toutes ces explications qui ne sont pas de mon niveau.

    Merci � tous.

    P.S. pour nikko34 qui s'int�roge sur le domaine d'application du programme original.

    Dans le cadre de cet apprantissage, je me suis donn� comme excercice la r�solution d'�quation du second degr� en essayant d'inclure dans le code un maximum de 'proc�dures' entr�es, sorties, contr�les, boucles for, while, condions, etc. comme une sorte de lexique syntaxique d'application.
    Ce n'est pas tr�s compliqu� mais quand on d�bute �a demande beaucoup d'attention.
    L.P.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. convertir code ascii a string
    Par chadj dans le forum NetBeans
    R�ponses: 1
    Dernier message: 02/05/2013, 13h24
  2. [D�butant] Code Ascii dans variable de type string
    Par Nixeus dans le forum C#
    R�ponses: 2
    Dernier message: 03/01/2012, 15h32
  3. Remplacer char dans string par code ASCII
    Par ThomasParis dans le forum Langage
    R�ponses: 2
    Dernier message: 16/07/2010, 11h47
  4. transformer code ascii en string ?
    Par italiasky dans le forum Langage
    R�ponses: 1
    Dernier message: 20/10/2008, 11h39
  5. [String]Comment etendre le mon Code ASCII??
    Par lanfeustdetroll dans le forum API standards et tierces
    R�ponses: 24
    Dernier message: 25/07/2005, 14h42

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