 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
pascal baufre Guest
|
Posted: Mon Apr 26, 2004 10:26 pm Post subject: trop simple mais ca ne marche pas |
|
|
Bonjours tous
Le programme suivant est simple mais il ne marche pas sur DEV C++, serez
vous me dire pourquoi, c'est au niveau du switche, je ne comprend pas ce qui
empeche les instructions du switch qui ne s'écécute pas merci .
Pascal Baufre
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main()
{
char touche;
printf(" Entrez les donnees nn" );
printf("t1-Articlet3-Verben" );
printf("t2-Nomtt4-Quitteznn");
printf("");
scanf("%s",&touche);
switch (touche)
{
case 1: printf("111");
break;
case 2: printf("222 ");
break;
case 3: printf("3333");
break;
case 4: printf("444");
break;
default : printf("nmauvaise touche n");
}
getch();
system("PAUSE");
return 0;
}
|
|
| Back to top |
|
 |
Matthieu Moy Guest
|
Posted: Mon Apr 26, 2004 10:30 pm Post subject: Re: trop simple mais ca ne marche pas |
|
|
"pascal baufre" <pascal.baufre (AT) free (DOT) fr> writes:
| Quote: | Le programme suivant est simple mais il ne marche pas sur DEV C++, serez
vous me dire pourquoi, c'est au niveau du switche, je ne comprend pas ce qui
empeche les instructions du switch qui ne s'écécute pas merci .
|
Tu récupères un "char *", et tu fais le test en comparant avec des
entiers ...
--
Matthieu
|
|
| Back to top |
|
 |
Pierre Maurette Guest
|
Posted: Tue Apr 27, 2004 12:35 am Post subject: Re: trop simple mais ca ne marche pas |
|
|
"pascal baufre" <pascal.baufre (AT) free (DOT) fr> typa:
| Quote: | Bonjours tous
Le programme suivant est simple mais il ne marche pas sur DEV C++, serez
vous me dire pourquoi, c'est au niveau du switche, je ne comprend pas ce qui
empeche les instructions du switch qui ne s'écécute pas merci .
Pascal Baufre
#include <iostream.h
#include
#include
#include
#include
int main()
{
char touche;
printf(" Entrez les donnees nn" );
printf("t1-Articlet3-Verben" );
printf("t2-Nomtt4-Quitteznn");
printf("");
scanf("%s",&touche);
switch (touche)
{
case 1: printf("111");
break;
case 2: printf("222 ");
break;
case 3: printf("3333");
break;
case 4: printf("444");
break;
default : printf("nmauvaise touche n");
}
getch();
system("PAUSE");
return 0;
}
|
Bonjour,
Votre erreur provient du fait que les valeurs renvoyées par les
touches 1, 2, 3 et 4 ne sont pas 1, 2, 3 et 4, mais '1', '2', '3' et
'4'.
Ceci dit, si vous en postez d'autre, enlevez le #include
et postez sur fr.comp.lang.c. Vous compilez du code C en C++, vous
risquez la remarque.
Une proposition :
<code>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
int main()
{
char touche;
int fini;
printf(" Entrez les donnees nn");
printf("t1-Articlet3-Verben");
printf("t2-Nomtt4-Quitteznn");
printf("");
do
{
//scanf("%s", & touche);
touche = getch();
fini = 1;
switch(touche)
{
case '1':
printf("111n");
break;
case '2':
printf("222n");
break;
case '3':
printf("333n");
break;
case '4':
printf("444n");
break;
default:
printf("mauvaise touchen");
fini = 0;
}
}
while(fini == 0);
//getch();
system("PAUSE");
return 0;
}
</code>
--
Pierre
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Tue Apr 27, 2004 8:48 am Post subject: Re: trop simple mais ca ne marche pas |
|
|
"pascal baufre" <pascal.baufre (AT) free (DOT) fr> wrote
| Quote: | Le programme suivant est simple mais il ne marche pas sur DEV C++,
serez vous me dire pourquoi, c'est au niveau du switche, je ne
comprend pas ce qui empeche les instructions du switch qui ne
s'écécute pas merci .
#include <iostream.h
#include
#include
#include
#include
int main()
{
char touche;
printf(" Entrez les donnees nn" );
printf("t1-Articlet3-Verben" );
printf("t2-Nomtt4-Quitteznn");
printf("");
scanf("%s",&touche);
|
Attention. Ici, tu lis une chaîne de caractères, non un seul caractère.
Si l'utilisateur entre un '1', tu vas écrire le ´1' dans touche, et un
' ' quelque part ailleurs (en ce qui suit immédiatement touche dans la
mémoire. Et si par malheur, ton utilisateur entre "aaaaaaaaaaaaaaaaaa",
tu vas écrire tous ces caractères, à partir de l'adresse touche. Ce qui
risque de poser pas mal de problèmes.
En général, c'est extrement difficule à utiliser scanf, et le "%s" est
particulièrement dangéreux, et ne peut pas servir dans un programme
correct sans spécification de la longueur. Pour ce que tu veux faire,
une solution bien supérieur serait :
char touche ;
std::cin >> touche ;
if ( ! std::cin ) {
// Erreur, l'utilisateur n'a rien entrer.
} else {
switch ( touche ) {
// ...
| Quote: | switch (touche)
{
case 1: printf("111");
|
Enfin, on entre les caractères, pas des chiffres. Tu as deux choix :
int touche ;
std::cin >> touche ;
if ( ! std::cin ) {
// Erreur...
} else {
switch ( touche ) {
case 1 :
// ...
}
}
ou :
char touche ;
std::cin >> touche ;
if ( ! std::cin ) {
// Erreur...
} else {
switch ( touche ) {
case ´1' :
// ...
}
}
Dans les deux cas, tu dois faire un
std::cin.ignore( INT_MAX, 'n' ) ;
pour bouffer la reste de la ligne.
| Quote: | break;
case 2: printf("222 ");
break;
case 3: printf("3333");
break;
case 4: printf("444");
break;
default : printf("nmauvaise touche n");
}
getch();
|
Il n'y a pas de fonction getch() en C++. C'est une extension, propre à
MS-DOS, et supportée sous Windows pour des raisons de compatibilité avec
l'ancien. En plus, il ne collabore pas particulièrement avec stdin ni
avec cin -- il vaut mieux éviter de l'utiliser si tu n'est pas sous
MS-DOS ou si tu te sers ou de cin ou de stdin.
En l'occurance, je crois qu'un simple :
std::cin.ignore( INT_MAX, 'n' ) ;
(en plus de celui qui a servi à bouffer la reste de la ligne ci-dessus)
ferait l'affaire. (Pas besoin du "PAUSE" ci-dessous non plus.)
| Quote: | system("PAUSE");
return 0;
}
|
--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|