OVH Cloud OVH Cloud

trop simple mais ca ne marche pas

3 réponses
Avatar
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 \n\n" );
printf("\t1-Article\t3-Verbe\n" );
printf("\t2-Nom\t\t4-Quittez\n\n");
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;
}

3 réponses

Avatar
Matthieu Moy
"pascal baufre" writes:

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

Avatar
Pierre Maurette
"pascal baufre" typa:

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;
}


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 <iostream.h>
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

Avatar
kanze
"pascal baufre" wrote in message
news:<408d8ca0$0$509$...

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


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