Publicité
+ Répondre à la discussion
Page 1 sur 2 12 DernièreDernière
Affichage des résultats 1 à 20 sur 33
  1. #1
    Invité régulier
    Homme Profil pro Michael
    Etudiant en génie mécanique
    Inscrit en
    mars 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Nom : Homme Michael
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant en génie mécanique

    Informations forums :
    Inscription : mars 2011
    Messages : 137
    Points : 7
    Points
    7

    Par défaut printf et scanf

    Salut les copains!

    Je suis en train de lire pas mal de tutoriels sur le C++ et j'essaie de créer de petites applications simples pour vérifier que j'ai bien tout compris.
    Apparemment j'ai pas tout compris... ^^

    J'ai voulu écrire un programme qui demande à l'utilisateur d'écrire quelque chose, qui lise ce que l'utilisateur a écrit, et puis qui dise "vous avez écrit XXX".

    Voici mon code en l'état actuel:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <iostream> // c'était là quand j'ai créé le projet, j'ai pas touché
    #include<stdio.h>
     
    using namespace std; // c'était là quand j'ai créé le projet, j'ai pas touché
     
    int main() // c'était là quand j'ai créé le projet, j'ai pas touché
    {
        char a[100]; // je définis une chaîne de 100 caractères sans l'initialiser
     
        printf("Ecrivez quelque chose s'il-vous-plait...\n"); // consigne à l'utilisateur
        scanf("%[100]s", a); // lecture de la réponse de l'utilisateur
        printf("Vous avec ecrit : %a[100]"); // répéter la réponse de l'utilisateur
    }
    La compilation ne renvoie pas d'erreur, mais l'avertissement suivant, que je ne sais pas encore interpréter:

    Warning: unknown conversion type character 'a' in format

    À l'exécution, le programme produit le résultat suivant:
    Ecrivez quelque chose s'il-vous-plait...
    a (ça c'est ce que j'ai écrit)
    Vous avec ecrit : -0x1.9bf0b0p+808[100]
    Process returned 0 <0x0> execution time : 2.794 s
    Press any key to continue.

    Voilà. D'après mes connaissances actuelles, j'aurais tendance à dire que le "a" que j'ai écrit a été mal interprété (disons interprété "dans une autre langue"), ou qu'il n'a pas été renvoyé comme je m'y attendais. Le contenu renvoyé a un peu l'air d'une adresse, ou d'un truc du genre...

    Merci de m'expliquer ce qui n'allait pas.

  2. #2
    Modérateur

    Homme Profil pro Cyrille
    Network programmer
    Inscrit en
    juin 2010
    Messages
    2 069
    Détails du profil
    Informations personnelles :
    Nom : Homme Cyrille
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Network programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 2 069
    Points : 4 879
    Points
    4 879

    Par défaut

    Bonjour,

    si tu es en C++ oublie immédiatement les scanf et printf qui sont du C et passe à du std::cout et std::cin.

    Sinon, les crochets dans le formatage, tu as vu ça où ? Jamais entendu parler pour ma part. Pour limiter à 100 caractères, on fera %100s
    Et printf ne s'utilise pas comme ça pour formater une variable.

  3. #3
    Invité régulier
    Homme Profil pro Michael
    Etudiant en génie mécanique
    Inscrit en
    mars 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Nom : Homme Michael
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant en génie mécanique

    Informations forums :
    Inscription : mars 2011
    Messages : 137
    Points : 7
    Points
    7

    Par défaut

    Ok... ^^
    Je reviens après avoir recommencé en vrai C++ =D

  4. #4
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    juin 2012
    Messages
    849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2012
    Messages : 849
    Points : 1 581
    Points
    1 581

    Par défaut

    Hello,

    Utilise aussi des string au lieu de ton tableau de char (la aussi, c'est la façon de faire en C, pas en C++)

    doc ici

  5. #5
    Invité régulier
    Homme Profil pro Michael
    Etudiant en génie mécanique
    Inscrit en
    mars 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Nom : Homme Michael
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant en génie mécanique

    Informations forums :
    Inscription : mars 2011
    Messages : 137
    Points : 7
    Points
    7

    Par défaut

    Salut, merci!
    Les strings j'ai un peu essayé, mais ça marchait pas trop. Bon, en même temps c'est peut-être les printf scanf qui faisaient merder mon programme...

    Je reviens si j'ai de nouveaux problèmes =D

  6. #6
    Invité régulier
    Homme Profil pro Michael
    Etudiant en génie mécanique
    Inscrit en
    mars 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Nom : Homme Michael
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant en génie mécanique

    Informations forums :
    Inscription : mars 2011
    Messages : 137
    Points : 7
    Points
    7

    Par défaut

    Ah ben ça aura pas été long! ^^

    Je voudrais écrire un truc du genre:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    // déclaration
    string reponse;
     
    if (reponse=="oui") // ici j'ai une erreur
    {
    blablabla
    }
    else if (reponse=="non") // ici j'ai une erreur
    {
    blablabla
    }
    else
    {
    blablabla
    }
    Au niveau des erreurs, on me signale que la norme ISO C++ interdit la comparaison entre un pointeur et un entier. Je ne vois pas trop le rapport avec ce que j'ai écrit.
    Quelqu'un sait-il pourquoi j'ai ce genre de problème?

  7. #7
    Responsable Sécurité

    Avatar de Neckara
    Homme Profil pro Denis
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    4 800
    Détails du profil
    Informations personnelles :
    Nom : Homme Denis
    Âge : 21
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2011
    Messages : 4 800
    Points : 13 871
    Points
    13 871

    Par défaut

    Citation Envoyé par Bousk Voir le message
    Sinon, les crochets dans le formatage, tu as vu ça où ? Jamais entendu parler pour ma part.
    Printf et scanf acceptent des expression régulière il me semble :
    "%10[abc]" = 10 caractères a, b ou c
    "%[^\n]" = lire jusqu'au premier retour à la ligne.

    @Armulis :
    Essaye avec :
    Code :
    1
    2
    3
    4
    5
    #include <string>
     
    std::string reponse;
     
    if(reponse == "non");

  8. #8
    Invité régulier
    Homme Profil pro Michael
    Etudiant en génie mécanique
    Inscrit en
    mars 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Nom : Homme Michael
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant en génie mécanique

    Informations forums :
    Inscription : mars 2011
    Messages : 137
    Points : 7
    Points
    7

    Par défaut

    Merci Neckara, mais "#include <string>" et "using namespace std;" sont déjà au début de mon programme.

  9. #9
    Invité régulier
    Homme Profil pro Michael
    Etudiant en génie mécanique
    Inscrit en
    mars 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Nom : Homme Michael
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant en génie mécanique

    Informations forums :
    Inscription : mars 2011
    Messages : 137
    Points : 7
    Points
    7

    Par défaut

    C'est tout bon j'ai trouvé!

    Maintenant je cherche comment faire une petite temporisation (pour que le programme ne balance pas toujours tout ce qu'il a à dire en un instant sur la console.

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2013
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : janvier 2013
    Messages : 108
    Points : 69
    Points
    69

    Par défaut

    #include <unistd.h>
    sleep(10);

  11. #11
    Modérateur

    Homme Profil pro Cyrille
    Network programmer
    Inscrit en
    juin 2010
    Messages
    2 069
    Détails du profil
    Informations personnelles :
    Nom : Homme Cyrille
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Network programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 2 069
    Points : 4 879
    Points
    4 879

    Par défaut

    Citation Envoyé par Neckara Voir le message
    Printf et scanf acceptent des expression régulière il me semble :
    "%10[abc]" = 10 caractères a, b ou c
    "%[^\n]" = lire jusqu'au premier retour à la ligne.
    Ca a effectivement l'air d'être le cas pour le scanf, mais pas pour le printf.

  12. #12
    Invité régulier
    Homme Profil pro Michael
    Etudiant en génie mécanique
    Inscrit en
    mars 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Nom : Homme Michael
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant en génie mécanique

    Informations forums :
    Inscription : mars 2011
    Messages : 137
    Points : 7
    Points
    7

    Par défaut

    Merci Kripteks.
    Je demande juste un truc, puisque j'ai été averti à ce propos: sleep ne risque pas de surcharger mon processeur, si?
    Et la valeur à introduire correspond-elle à des millisecondes?

  13. #13
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2012
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2012
    Messages : 517
    Points : 1 101
    Points
    1 101

    Par défaut

    sleep venant de unistd.h fait une attente passive du nombre de secondes donné.
    (En C++11 on peut utiliser la solution (standard) de #include <chrono> avec std::this_thread::sleep_for(std::chrono::seconds(s)); ou std::this_thread::sleep_for(std::chrono::milliseconds(ms)); par exemple.)

  14. #14
    Invité régulier
    Homme Profil pro Michael
    Etudiant en génie mécanique
    Inscrit en
    mars 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Nom : Homme Michael
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant en génie mécanique

    Informations forums :
    Inscription : mars 2011
    Messages : 137
    Points : 7
    Points
    7

    Par défaut

    Ok, ok... ^^
    Y'a ce qu'il me fallait, mais j'avoue ne pas avoir tout compris sur la fin =D
    Je vais sûrement y venir en progressant, alors je garde ça au chaud, merci!

  15. #15
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2012
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2012
    Messages : 517
    Points : 1 101
    Points
    1 101

    Par défaut

    Il y a pas grand chose à comprendre
    Il s'agit juste d'un appel de fonction sleep_for qui prend en paramètre une durée std::chrono::seconds(le_nombre_de_secondes_que_tu_veux_attendre).
    (Il faut activer C++11 pour pouvoir l'utiliser.)

  16. #16
    Invité régulier
    Homme Profil pro Michael
    Etudiant en génie mécanique
    Inscrit en
    mars 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Nom : Homme Michael
    Localisation : Suisse

    Informations professionnelles :
    Activité : Etudiant en génie mécanique

    Informations forums :
    Inscription : mars 2011
    Messages : 137
    Points : 7
    Points
    7

    Par défaut

    Mmh... sleep ne fonctionne pas, apparemment.
    J'ai mal compris?

    Voici ce que j'ai écrit:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <iostream>
    #include <unistd.h>
     
    using namespace std;
     
    int main()
    {
        cout << "Salut!" << endl;
        sleep(3);
        cout << "Ca va bien?" << endl;
        return 0;
    }
    L'erreur renvoyée est: "sleep was not declared in this scope". Je ne comprends pas...

  17. #17
    Modérateur

    Homme Profil pro Cyrille
    Network programmer
    Inscrit en
    juin 2010
    Messages
    2 069
    Détails du profil
    Informations personnelles :
    Nom : Homme Cyrille
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Network programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 2 069
    Points : 4 879
    Points
    4 879

    Par défaut

    Si tu es sous windows, il faut utiliser Sleep de windows.h

    Sous Unix il s'agira de usleep de unistd.h

  18. #18
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    juin 2012
    Messages
    849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2012
    Messages : 849
    Points : 1 581
    Points
    1 581

    Par défaut

    Citation Envoyé par Bousk Voir le message
    Sous Unix il s'agira de usleep de unistd.h
    sleep existe aussi.

    Mais de toute façon pour quelqu'un qui commence le C++, autant prendre de bonnes habitudes et utiliser des fonctions standards (et portable) là où c'est possible.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    // g++ -std=c++0x main.cpp -o main
    #include <thread>
    #include <chrono>
     
    int main() {
       std::this_thread::sleep_for(std::chrono::seconds(3)); // sleep 3 sec
       return 0;
    }
    C'est pas plus dur à utiliser, et ça marche partout.

  19. #19
    Membre Expert
    Inscrit en
    novembre 2004
    Messages
    2 554
    Détails du profil
    Informations forums :
    Inscription : novembre 2004
    Messages : 2 554
    Points : 1 987
    Points
    1 987

    Par défaut

    Pas sous Visual C++ 2010, malheureusement... :/
    VDS "The C++ Standard Library" (Josuttis) -> 20 €

  20. #20
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    juin 2012
    Messages
    849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2012
    Messages : 849
    Points : 1 581
    Points
    1 581

    Par défaut

    Ni sous gcc 4.6, mais par "partout" j'entendais "tout compilo qui à des notions de c++11", comme tu t'en doutais je pense.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •