trop simple mais ca ne marche pas

Le
pascal baufre
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 " );
printf("t1-Articlet3-Verbe" );
printf("t2-Nomtt4-Quittez");
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("mauvaise touche ");
}
getch();
system("PAUSE");
return 0;
}
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Matthieu Moy
Le #723257
"pascal baufre"
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

Pierre Maurette
Le #723255
"pascal baufre"
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 #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 #include #include
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

kanze
Le #722973
"pascal baufre" news:
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 #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 ) {
// ...


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.

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.)

system("PAUSE");
return 0;
}


--
James Kanze GABI Software mailto:
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

Publicité
Poster une réponse
Anonyme