Précédent   Forum du club des développeurs et IT Pro > C et C++ > C++
C++ Forum d'entraide technique sur le langage C++. Avant de poster -> F.A.Q C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 23/02/2013, 20h02   #1
Armulis
Invité de passage
 
Inscription : mars 2011
Messages : 43
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 43
Points : 3
Points : 3
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.
Armulis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2013, 20h11   #2
Bousk
Modérateur
 
Homme Cyrille
Network programmer
Inscription : juin 2010
Messages : 1 570
Détails du profil
Informations personnelles :
Nom : Homme Cyrille
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Network programmer

Informations forums :
Inscription : juin 2010
Messages : 1 570
Points : 4 156
Points : 4 156
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.
Bousk est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 23/02/2013, 20h26   #3
Armulis
Invité de passage
 
Inscription : mars 2011
Messages : 43
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 43
Points : 3
Points : 3
Ok... ^^
Je reviens après avoir recommencé en vrai C++ =D
Armulis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2013, 11h44   #4
Iradrille
Membre éprouvé
 
Homme
Étudiant
Inscription : juin 2012
Messages : 274
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2012
Messages : 274
Points : 464
Points : 464
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
Iradrille est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/02/2013, 19h48   #5
Armulis
Invité de passage
 
Inscription : mars 2011
Messages : 43
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 43
Points : 3
Points : 3
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
Armulis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2013, 19h56   #6
Armulis
Invité de passage
 
Inscription : mars 2011
Messages : 43
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 43
Points : 3
Points : 3
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?
Armulis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2013, 20h10   #7
Neckara
Rédacteur/Modérateur

 
Avatar de Neckara
 
Homme Denis
Étudiant
Inscription : décembre 2011
Messages : 2 838
Détails du profil
Informations personnelles :
Nom : Homme Denis
Localisation : France, Loire (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2011
Messages : 2 838
Points : 8 628
Points : 8 628
Envoyer un message via MSN à Neckara Envoyer un message via Skype™ à Neckara
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");
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon.

Chaîne Youtube : Vidéos

Ma page DVP : http://neckara.developpez.com/
Neckara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2013, 20h19   #8
Armulis
Invité de passage
 
Inscription : mars 2011
Messages : 43
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 43
Points : 3
Points : 3
Merci Neckara, mais "#include <string>" et "using namespace std;" sont déjà au début de mon programme.
Armulis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2013, 20h38   #9
Armulis
Invité de passage
 
Inscription : mars 2011
Messages : 43
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 43
Points : 3
Points : 3
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.
Armulis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2013, 20h45   #10
kripteks
Membre du Club
 
Homme
Étudiant
Inscription : janvier 2013
Messages : 58
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2013
Messages : 58
Points : 55
Points : 55
#include <unistd.h>
sleep(10);
kripteks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2013, 00h11   #11
Bousk
Modérateur
 
Homme Cyrille
Network programmer
Inscription : juin 2010
Messages : 1 570
Détails du profil
Informations personnelles :
Nom : Homme Cyrille
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Network programmer

Informations forums :
Inscription : juin 2010
Messages : 1 570
Points : 4 156
Points : 4 156
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.
Bousk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2013, 08h47   #12
Armulis
Invité de passage
 
Inscription : mars 2011
Messages : 43
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 43
Points : 3
Points : 3
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?
Armulis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2013, 08h56   #13
Ehonn
Membre expérimenté
 
Étudiant
Inscription : février 2012
Messages : 247
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2012
Messages : 247
Points : 503
Points : 503
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.)
Ehonn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2013, 09h12   #14
Armulis
Invité de passage
 
Inscription : mars 2011
Messages : 43
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 43
Points : 3
Points : 3
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!
Armulis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2013, 09h29   #15
Ehonn
Membre expérimenté
 
Étudiant
Inscription : février 2012
Messages : 247
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2012
Messages : 247
Points : 503
Points : 503
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.)
Ehonn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2013, 11h40   #16
Armulis
Invité de passage
 
Inscription : mars 2011
Messages : 43
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 43
Points : 3
Points : 3
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...
Armulis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2013, 11h49   #17
Bousk
Modérateur
 
Homme Cyrille
Network programmer
Inscription : juin 2010
Messages : 1 570
Détails du profil
Informations personnelles :
Nom : Homme Cyrille
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Network programmer

Informations forums :
Inscription : juin 2010
Messages : 1 570
Points : 4 156
Points : 4 156
Si tu es sous windows, il faut utiliser Sleep de windows.h

Sous Unix il s'agira de usleep de unistd.h
Bousk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2013, 12h25   #18
Iradrille
Membre éprouvé
 
Homme
Étudiant
Inscription : juin 2012
Messages : 274
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2012
Messages : 274
Points : 464
Points : 464
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.
Iradrille est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2013, 12h33   #19
oodini
Membre Expert
 
Inscription : novembre 2004
Messages : 2 073
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 2 073
Points : 1 458
Points : 1 458
Pas sous Visual C++ 2010, malheureusement... :/
__________________
VDS "The C++ Standard Library" (Josuttis) -> 30 €
oodini est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2013, 12h37   #20
Iradrille
Membre éprouvé
 
Homme
Étudiant
Inscription : juin 2012
Messages : 274
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2012
Messages : 274
Points : 464
Points : 464
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.
Iradrille est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 05h13.


 
 
 
 
Partenaires

Hébergement Web