Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comment utiliser scanf en C++

peut on l'utiliser ?

    12 mai 2008 à 16:12:08

    Bonjour,

    J'aimerais qu'un visiteur entre une donnée et que cette donnée soit enregistrée dans une variable.

    Avec C j'ai utilisé scanf.

    Peut-on encore l'utiliser avec C++

    Si oui, sauriez-vous me donner un exemple d'utilisation :

    scanf(const char*,...) ça, ça doit être le prototype.

    J'ai fais ceci :
    printf("\nVeuillez svp indiquer le nom d'un produit que vous voulez acheter");
    
    	const char* ProduitVoulu = scanf("%s",&ProduitVoulu);
    


    mais j'obtiens ce message d'erreur :

    Citation : VC++6

    'initializing' : cannot convert from 'int' to 'const char *'



    Merci d'avance.

    beegees
    • Partager sur Facebook
    • Partager sur Twitter
      12 mai 2008 à 16:23:12

      char* ProduitVoulu = new char[50];
      printf("\nVeuillez svp indiquer le nom d'un produit que vous voulez acheter");
      scanf("%s",&ProduitVoulu);
      
      //Le plus simple en C++ étant quand même :
      
      cin >> ProduitVoulu;
      //Avec <iostream> en include 
      


      Edit : correction d'une erreur de 2 grosses bourdes plus grosses que moi dans un code qui ne fait pourtant que 4 lignes.
      ... Si ça continue comme ça j'vais m'pendre...
      • Partager sur Facebook
      • Partager sur Twitter
      Zeste de Savoir, le site qui en a dans le citron !
        12 mai 2008 à 16:38:55

        Citation : NoHaR

        char* ProduitVoulu;
        printf("\nVeuillez svp indiquer le nom d'un produit que vous voulez acheter");
        scanf("%s",&ProduitVoulu);
        
        //Le plus simple en C++ étant quand même :
        
        ProduitVoulu << cin;
        //Avec <iostream> en include 
        


        Salut,

        Merci beaucoup pour ta réponse.
        ça fonctionne.

        Encore merci.

        beegees

        • Partager sur Facebook
        • Partager sur Twitter
          12 mai 2008 à 16:57:37

          Bonjour,

          beegees >
          scanf fonctionne de la même manière en C et en C++. scanf fait partie de la bibliothèque standard du C qui est aussi inclue dans la bibliothèque standard du C++. Pour accèder à scanf, il faut en C++ normalement inclure cstdio :
          #include <cstdio>
          


          NoHaR >
          j'ai comme l'impression que tu as besoin de réviser les entrées/sorties en C++ autant que beegees à besoin de les réviser en C. ^^

          ce n'est pas :
          ProduitVoulu << cin;
          

          mais :
          cin >> ProduitVoulu;
          

          • Partager sur Facebook
          • Partager sur Twitter
          Inkamath on GitHub - Interpréteur d'expressions mathématiques. Reprise du développement en cours.
            12 mai 2008 à 16:59:32

            Merci beaucoup iNaKoll,

            s'est bien gentil.

            Bon Lundi.

            beegees
            • Partager sur Facebook
            • Partager sur Twitter
              12 mai 2008 à 17:05:34

              LOL ! Oui en effet !
              Désolé :D.



              • Partager sur Facebook
              • Partager sur Twitter
              Zeste de Savoir, le site qui en a dans le citron !
                12 mai 2008 à 17:29:39

                Personne n'est choqué par les lectures dans des zones non réservées ? Lectures qui déborderaient en plus ...
                Il serait temps d'oublier les char*.
                • Partager sur Facebook
                • Partager sur Twitter
                C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                  12 mai 2008 à 17:32:20

                  je vais l'oublier, laisse moi 3 semaines.

                  Merci pour la remarque
                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 mai 2008 à 17:41:54

                    Citation : lmghs

                    Personne n'est choqué par les lectures dans des zones non réservées ? Lectures qui déborderaient en plus ...
                    Il serait temps d'oublier les char*.



                    Effectivement ! Maintenant que tu le dis, c'est sur que ça fait froid dans le dos mais pour ma défense je dirais que le choc des deux premiers messages à été trop violent pour que je ne remarque ce "détail". :-°

                    beegees > n'essaye pas d'aller plus vite que la musique, tu as du louper un ou deux chapitre du cours de C++ de Mateo... La lecture des chapitres 2 et 5 de la première partie te ferait à mon avis le plus grand bien !
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Inkamath on GitHub - Interpréteur d'expressions mathématiques. Reprise du développement en cours.
                      12 mai 2008 à 18:23:54

                      Mea culpa, j'ai simplement pris son code pour le transformer tel quel sans réfléchir, et en écrivant une connerie de surcroit, et j'ai tapé mon truc beaucoup trop vite, sans utiliser de strings ou de choses du genre.

                      C'est anti-pédago, je sais.

                      Tant pis, maintenant que la honte est abattue sur moi pour 3 générations suite à ce code, une de plus ou une de moins... 'pouvez m'achever -_-

                      (le pire, c'est que j'utilise C++ tous les jours au taf !!)

                      Moralité : qui qu'on soit, on n'est jamais à l'abris d'un gros moment d'absence.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Zeste de Savoir, le site qui en a dans le citron !
                        12 mai 2008 à 18:28:24

                        Citation : NoHaR

                        Mea culpa, j'ai simplement pris son code pour le transformer tel quel sans réfléchir, et en écrivant une connerie de surcroit, et j'ai tapé mon truc beaucoup trop vite, sans utiliser de strings ou de choses du genre.

                        C'est anti-pédago, je sais.

                        Tant pis, maintenant que la honte est abattue sur moi pour 3 générations suite à ce code, une de plus ou une de moins... 'pouvez m'achever -_-

                        (le pire, c'est que j'utilise C++ tous les jours au taf !!)

                        Moralité : qui qu'on soit, on n'est jamais à l'abris d'un gros moment d'absence.



                        T'as voulu aider quelqu'un et t'as fait une erreur d'inatention.

                        Je trouve que le jugement est un peu dur !

                        Je ne me cherche pas d'excuse mais si je programme comme ça s'est parce que notre prof nous apprend comme ça, s'est eux qui devrait faire un peu plus attention.

                        ça ne sert à rien de vous acharner sur nous, pour ma part, ça fais trois jours que je suis occupé sur ce C++, trois jours que je n'ai pas mis le nez dehors, vous avez vu le soleil, pouf

                        • Partager sur Facebook
                        • Partager sur Twitter
                          12 mai 2008 à 18:34:27

                          Bah, parti d'un bon sentiment ou pas :

                          déclarer un char* sans l'allouer, ainsi que la bourde d'après avec cin... ça tient de l'erreur qu'on fait quand on débute et qu'on n'a jamais encore vraiment fait de C++.

                          Qu'un débutant la fasse et qu'on le renvoie vers le cours, passe encore je veux dire.
                          Mais avec un bac+5 en informatique, faut avouer que ça laisse très sérieusement à douter de mes compétences.

                          Donc oui, effectivement, ils ont un jugement très dur (en ce qui me concerne) et ils ont bien raison ;) .


                          • Partager sur Facebook
                          • Partager sur Twitter
                          Zeste de Savoir, le site qui en a dans le citron !
                            12 mai 2008 à 18:58:50

                            quoi qu'il en soit, quoi que nous ayons fait, un forum n'est pas là pour juger les gens mais pour les aider, si ils n'ont pas envie d'aider, ils ne sont pas obliger, mais je n'accepte pas les critiques gratuites et faciles ! OUI le char* du C++ doit disparaitre, qu'il disparaisse déjà dans les cours (écoles et autres) après on verra
                            • Partager sur Facebook
                            • Partager sur Twitter
                              12 mai 2008 à 19:23:21

                              ???
                              Qui juge ? Le code est voué à planter à l'exécution, c'est un fait.

                              De plus, les lectures sans précautions sont à éviter, en C scanf est déconseillé (cf le forum le forum d'à côté), en C++ pour la même raison on ne lit pas des char* (ou char[]) avec >> -- même en C++ pré-98. Ce ne sont que des faits qui ont été rappelés.

                              Quant à "être choqué", c'est une correction (comme correction d'exercice): la réaction saine que tout le monde devrait avoir en voyant des pointeurs ainsi utilisés.
                              • Partager sur Facebook
                              • Partager sur Twitter
                              C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                                12 mai 2008 à 19:51:08

                                Citation : NoHaR

                                Bah, parti d'un bon sentiment ou pas :

                                déclarer un char* sans l'allouer, ainsi que la bourde d'après avec cin... ça tient de l'erreur qu'on fait quand on débute et qu'on n'a jamais encore vraiment fait de C++.

                                Qu'un débutant la fasse et qu'on le renvoie vers le cours, passe encore je veux dire.
                                Mais avec un bac+5 en informatique, faut avouer que ça laisse très sérieusement à douter de mes compétences.

                                Donc oui, effectivement, ils ont un jugement très dur (en ce qui me concerne) et ils ont bien raison ;) .


                                Euh... pour ma part, je ne me permet pas de juger qui que ce soit. Des erreurs, on en fait tous ! J'ai déjà fait bien pire que ça mais je ne vous raconterais pas ! ^^

                                Citation : beegees

                                quoi qu'il en soit, quoi que nous ayons fait, un forum n'est pas là pour juger les gens mais pour les aider, si ils n'ont pas envie d'aider, ils ne sont pas obliger, mais je n'accepte pas les critiques gratuites et faciles ! OUI le char* du C++ doit disparaitre, qu'il disparaisse déjà dans les cours (écoles et autres) après on verra


                                Aider, on ne fait que ça ! Mais malheureusement, les petites moqueries pas méchantes du tout peuvent être mal interprétées, je m'en rend compte... :(
                                Quand lmghs dit "qu'il serait temps d'oublier les char* ", il sous-entend à mon avis que la manipulation des chaines de caractères "façon C" sont sources de nombreuses erreurs. Pour les utilisations les plus courantes, il vaut mieux utiliser la classe string de la librairie standard du C++.. Ça évite d'avoir à se poser trop de questions avec l'allocation mémoire !
                                Si on apprend dans les cours d'info à utiliser les char* dans un premier temps, c'est souvent parce que l'on commence (à tord?) par apprendre les bases du C. Malgré la difficulté, la manipulation des char* permet d'appréhender la relation pointeur/tableau.. Donc à mon avis les char* sont pas près de disparaitre des cours !
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Inkamath on GitHub - Interpréteur d'expressions mathématiques. Reprise du développement en cours.
                                  12 mai 2008 à 19:53:28

                                  ok j'ai réagi un peu vite, je m'excuse, je dois l'avouer, votre aide m'est (pour ne parler que de moi) INDISPENSABLE et PRECIEUSE et je ne vous en remercierai jamais assez.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    12 mai 2008 à 20:04:30

                                    Pour en revenir aux char*, je pense au cas particulier des bibliothèques du C que l'on utilise indifféremment pour des codes en C ou C++ (notamment celle sans laquelle je n'aurais jamais lâché mon petit Java pour coder en C++ : OpenCV).

                                    Dans ce cas précis, il est vrai que les chaînes de caractères qu'il faut passer en paramètre de certaines fonctions demeurent (et c'est bien normal) des (const) char*, d'où le fait qu'on ne puisse pas complètement se passer des char* :D .

                                    Bien qu'en C++ on puisse en fait utiliser la méthode string::cstr() (si je ne m'abuse), ce qui nous permet de sécuriser un peu plus le code en utilisant des strings et d'utiliser tout de même ces fonctions précises.

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Zeste de Savoir, le site qui en a dans le citron !
                                      12 mai 2008 à 20:16:23

                                      Ou même vector<char>... qui résistera mieux aux exceptions qu'un char*.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                                        13 mai 2008 à 14:58:30

                                        Citation : NoHaR

                                        char* ProduitVoulu = new char[50];
                                        printf("\nVeuillez svp indiquer le nom d'un produit que vous voulez acheter");
                                        scanf("%s",&ProduitVoulu);
                                        
                                        //Le plus simple en C++ étant quand même :
                                        
                                        cin >> ProduitVoulu;
                                        //Avec <iostream> en include 
                                        



                                        Edit : correction d'une erreur de 2 grosses bourdes plus grosses que moi dans un code qui ne fait pourtant que 4 lignes.
                                        ... Si ça continue comme ça j'vais m'pendre...



                                        Il reste des erreurs (pas de & devant ProduitVoulu dans scanf(). Par ailleurs, il est fortement recommandé de controler le nombre de caracteres saisis et de purge le buffer clavier après usage. Le code devient:

                                        #include <cstdlib>
                                        #include <cstdio>
                                        #include <iostream>
                                        #include <limits>
                                        #include <new>
                                        
                                        using namespace std;
                                        
                                        /* -tc- Elimine es caracteres non lus par scanf() */
                                        void purge()
                                        {
                                            std::cin.ignore( std::numeric_limits<streamsize>::max(), '\n' );
                                        }
                                        
                                        int main()
                                        {
                                            int ret = 0;
                                            char* ProduitVoulu = NULL;
                                        
                                            try
                                            {
                                                ProduitVoulu = new char[50];
                                                printf("Veuillez svp indiquer le nom d'un produit que vous voulez acheter : ");
                                                fflush(stdout);
                                                scanf("%49s", ProduitVoulu);
                                                purge();
                                            }
                                            catch (bad_alloc)
                                            {
                                                fprintf(stderr, "Erreur: allocation de memoire impossible!");
                                                ret = EXIT_FAILURE;
                                            }
                                        
                                            cout << ProduitVoulu << endl;
                                        
                                            return ret;
                                        }
                                        


                                        C'est certain qu'utiliser scanf() n'est pas réellement choisir la solution de facilité. Son usage est déjà déconseillé en C, alors en C++... Préférer:

                                        #include <iostream>
                                        #include <limits>
                                        
                                        using namespace std;
                                        
                                        /* -tc- Elimine es caracteres non lus sur le buffer clavier */
                                        void purge()
                                        {
                                            std::cin.ignore( std::numeric_limits<streamsize>::max(), '\n' );
                                        }
                                        
                                        int main()
                                        {
                                            string ProduitVoulu;
                                        
                                            cout << "Veuillez svp indiquer le nom d'un produit que vous voulez acheter : ";
                                            cin >> ProduitVoulu;
                                            purge();
                                            cout << ProduitVoulu << endl;
                                        
                                            return 0;
                                        }
                                        


                                        Thierry
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          13 mai 2008 à 15:01:56

                                          Attention au mélange IO C et IO C++.
                                          PS: toujours attraper les objets exception par référence (constante si possible)
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                                            13 mai 2008 à 15:26:17

                                            Bon, avec mon ton le plus solennel :

                                            La prochaine fois que j'essaye de poster un code sur un forum, je jure que j'essayerai de le compiler avant ! :D

                                            Ces petites absences qui apportent de gros moments de solitude...
                                            ...

                                            Si les compilateurs pouvaient parler, on se marrerait pas tous les jours !!
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Zeste de Savoir, le site qui en a dans le citron !
                                              13 mai 2008 à 16:12:13

                                              Citation : lmghs

                                              Attention au mélange IO C et IO C++.
                                              PS: toujours attraper les objets exception par référence (constante si possible)



                                              Oui, c'est un non sens de mélanger les API. Mais le PO semble vouloir absolument utiliser scanf().

                                              Thierry
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                13 mai 2008 à 16:18:12

                                                Citation : NoHaR

                                                Si les compilateurs pouvaient parler, on se marrerait pas tous les jours !!



                                                Il y a des compilateurs qui parlent! lmghs, par exemple, en est un. ;)

                                                Avec l'expérience, on devient mieux qu'un compilateur sur deux pattes. Un chance, sinon, nous n'aurions plus besoin de développeurs.
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  13 mai 2008 à 17:07:13

                                                  Hum. "Interpréteur" à la limite, cela laisse de la place aux travers. ^^'
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                  C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.

                                                  Comment utiliser scanf en C++

                                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                  • Editeur
                                                  • Markdown