Problème saisie en C
Résolu/Fermé
diocool
Messages postés
367
Date d'inscription
mardi 26 février 2008
Statut
Membre
Dernière intervention
21 octobre 2010
-
23 déc. 2008 à 22:32
diocool Messages postés 367 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 21 octobre 2010 - 24 déc. 2008 à 01:35
diocool Messages postés 367 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 21 octobre 2010 - 24 déc. 2008 à 01:35
A voir également:
- Problème saisie en C
- Saisie gestuelle iphone - Guide
- Saisie vocale sms - Guide
- Gboard saisie vocale - Accueil - Applications & Logiciels
- Saisie vocale whatsapp - Accueil - Messagerie instantanée
- Saisie automatique - Guide
7 réponses
spoophy
Messages postés
354
Date d'inscription
mercredi 17 décembre 2008
Statut
Membre
Dernière intervention
19 août 2009
41
23 déc. 2008 à 22:45
23 déc. 2008 à 22:45
c'est simple si tu ne met pas une séquence pour interrompre ton programme il s'exécutera puis se fermera tous seul sans te le demander c'est pour cela qu'il faut crée une var int ou char n'importe puis demander d'entrer cette valeur a la fin de ton programme
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
23 déc. 2008 à 23:25
23 déc. 2008 à 23:25
Non, t'inquiète, ce n'est pas ça l'erreur. Tu as bien pensé au getch();
Par contre, évite d'utiliser cette fonction qui n'est pas portable (conio.h n'est pas standard C). Utilise getchar(); de stdlib.h. Et pendant qu'on y est, le prototype du main est int main(void) et non void. De plus scanf("%s",P[i].libp); (pas besoin de l'esperluette (&) pour un tableau ou un pointeur.
Mais, ça ne corrigera pas ton problème ^^ (à moins que...)
Sinon, tu veux dire que ton programme se ferme tout juste après avoir rentré le libellé ? Si ce n'est pas ça, donne un exemple d'exécution.
Cdlt
Par contre, évite d'utiliser cette fonction qui n'est pas portable (conio.h n'est pas standard C). Utilise getchar(); de stdlib.h. Et pendant qu'on y est, le prototype du main est int main(void) et non void. De plus scanf("%s",P[i].libp); (pas besoin de l'esperluette (&) pour un tableau ou un pointeur.
Mais, ça ne corrigera pas ton problème ^^ (à moins que...)
Sinon, tu veux dire que ton programme se ferme tout juste après avoir rentré le libellé ? Si ce n'est pas ça, donne un exemple d'exécution.
Cdlt
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
23 déc. 2008 à 23:32
23 déc. 2008 à 23:32
Salut,
Utilise getchar(); de stdlib.h.
Tu dois être fatigué ;-))
man getchar
Utilise getchar(); de stdlib.h.
Tu dois être fatigué ;-))
man getchar
GETS(3) Manuel du programmeur Linux GETS(3) NOM gets, fgetc, fgets, getc, getchar, ungetc - Saisie de caractères et de chaînes SYNOPSIS #include <stdio.h>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
>
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
23 déc. 2008 à 23:40
23 déc. 2008 à 23:40
Erf, bien vu ;) T'avais même pas besoin de me sortir le man ^^.
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
23 déc. 2008 à 23:42
23 déc. 2008 à 23:42
Re,
En fait man c'était pour diocool ;-))
En fait man c'était pour diocool ;-))
diocool
Messages postés
367
Date d'inscription
mardi 26 février 2008
Statut
Membre
Dernière intervention
21 octobre 2010
12
>
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
23 déc. 2008 à 23:41
23 déc. 2008 à 23:41
le programme se ferme tout juste après la saisie du libellé.
ça ne marche toujours pas.
ça ne marche toujours pas.
spoophy
Messages postés
354
Date d'inscription
mercredi 17 décembre 2008
Statut
Membre
Dernière intervention
19 août 2009
41
23 déc. 2008 à 23:45
23 déc. 2008 à 23:45
c'est que vous avez m*rdais met la demande du char avant la fin du programme
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
23 déc. 2008 à 23:52
23 déc. 2008 à 23:52
c'est que vous avez m*rdais met la demande du char avant la fin du programme
Lla demande du char à la fin du programme est présente. Regarde son getch(); final ;)
Lla demande du char à la fin du programme est présente. Regarde son getch(); final ;)
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
23 déc. 2008 à 23:49
23 déc. 2008 à 23:49
Ok, j'ai compris d'où vient l'erreur. C'est à cause du '\n' stocké dans le buffer clavier.
Après ton scanf("%s") ... effectue :
Cdlt
Après ton scanf("%s") ... effectue :
while(getchar()!='\n');
Cdlt
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
23 déc. 2008 à 23:55
23 déc. 2008 à 23:55
Re,
Ben, voici un test
Ben, voici un test
lami20j@debian:~/trash$ cat ccm17_problemesaisie.c #include<stdio.h> #define N 4 int main () { struct Produit { int num; char libp[25]; float pu; int qte; }; struct Produit P[N]; float ptotal; int i, dnum; // clrscr (); for (i = 0; i < N; i++) { printf ("\nProduit P%d: \n", i + 1); printf ("Num,ro: "); scanf ("%d", &P[i].num); printf ("Libell,: "); scanf ("%s", &P[i].libp); printf ("Prix Unitaire: "); scanf ("%f", &P[i].pu); printf ("Quantit,: "); scanf ("%d", &P[i].qte); } printf ("\nDonnez le num,ro recherch,: "); scanf ("%d", &dnum); i = 0; ptotal = 0; while (i < N) { if (P[i].num == dnum) { ptotal = ptotal + P[i].pu * P[i].qte; } i++; } printf ("Le prix total du produit\ ayant pour num,ro %d est: %.1f", dnum, ptotal); getchar (); return 0; }Le résultat
lami20j@debian:~/trash$ gcc ccm17_problemesaisie.c lami20j@debian:~/trash$ ./a.out Produit P1: Num,ro: 1 Libell,: aaa Prix Unitaire: 1 Quantit,: 1 Produit P2: Num,ro: 2 Libell,: bbb Prix Unitaire: 2 Quantit,: 2 Produit P3: Num,ro: 3 Libell,: ccc Prix Unitaire: 3 Quantit,: 3 Produit P4: Num,ro: 4 Libell,: ddd Prix Unitaire: 4 Quantit,: 4 Donnez le num,ro recherch,: 3 Le prix total du produitayant pour num,ro 3 est: 9.0lami20j@debian:~/trash$
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
23 déc. 2008 à 23:59
23 déc. 2008 à 23:59
Lol, toi t'as pas relu la modification de mon message ^^.
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
24 déc. 2008 à 00:07
24 déc. 2008 à 00:07
Re,
Effectivement, on été en train de poster en même temps.
Mais sans aucune modification dans les instructions (sauf conio et clrsrc et int main) le programme fonctionne
Effectivement, on été en train de poster en même temps.
Mais sans aucune modification dans les instructions (sauf conio et clrsrc et int main) le programme fonctionne
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
>
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
24 déc. 2008 à 00:10
24 déc. 2008 à 00:10
N'oublie pas que t'es sous linux, et que tu lances le programme en console. Donc ta fenêtre ne se ferme pas à la fin.
Dans son cas, il a bien mis le getch à la fin, mais à la fin du scanf, il y a un '\n' qui va trainer dans le buffer et répondre au getch() et après, fin du programme. Enfin, vu que je suis pas sûr de bien à voir compris son erreur (c'est d'ailleurs pour ça que je voulais une trace d'exécution sur sa machine ^^).
Dans son cas, il a bien mis le getch à la fin, mais à la fin du scanf, il y a un '\n' qui va trainer dans le buffer et répondre au getch() et après, fin du programme. Enfin, vu que je suis pas sûr de bien à voir compris son erreur (c'est d'ailleurs pour ça que je voulais une trace d'exécution sur sa machine ^^).
diocool
Messages postés
367
Date d'inscription
mardi 26 février 2008
Statut
Membre
Dernière intervention
21 octobre 2010
12
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
24 déc. 2008 à 00:23
24 déc. 2008 à 00:23
Voici une vue de l'exécution:
Produit P1:
Numéro: 1
Libellé: montre
Produit P1:
Numéro: 1
Libellé: montre
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
>
diocool
Messages postés
367
Date d'inscription
mardi 26 février 2008
Statut
Membre
Dernière intervention
21 octobre 2010
24 déc. 2008 à 00:33
24 déc. 2008 à 00:33
t'as bien mis :
après chacun de tes scanf ?
while(getchar()!='\n');
après chacun de tes scanf ?
diocool
Messages postés
367
Date d'inscription
mardi 26 février 2008
Statut
Membre
Dernière intervention
21 octobre 2010
12
24 déc. 2008 à 01:08
24 déc. 2008 à 01:08
Je les ai mis mais ça ne marche toujours pas.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
24 déc. 2008 à 01:11
24 déc. 2008 à 01:11
En fait, je pense savoir l'erreur. C'est tout con, vu le message d'erreur, les scanf de float ne marche pas en natif avec ton turbo C. Tu devrais faire un essai avec un simple programme qui contient juste un float toto; scanf("%f",&toto);
En tout cas, vaut mieux utiliser des compilateurs qui respectent les normes. Ca évite les mauvaises surprises.
En tout cas, vaut mieux utiliser des compilateurs qui respectent les normes. Ca évite les mauvaises surprises.
diocool
Messages postés
367
Date d'inscription
mardi 26 février 2008
Statut
Membre
Dernière intervention
21 octobre 2010
12
24 déc. 2008 à 01:21
24 déc. 2008 à 01:21
J'ai essayé ce qui suit et c'est bon:
#include<stdio.h>
#include<conio.h>
void main()
{ float toto;
clrscr();
printf("Saisir: ");
scanf("%f",&toto);
printf("Val = %f",toto);
getch();
}
#include<stdio.h>
#include<conio.h>
void main()
{ float toto;
clrscr();
printf("Saisir: ");
scanf("%f",&toto);
printf("Val = %f",toto);
getch();
}
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
>
diocool
Messages postés
367
Date d'inscription
mardi 26 février 2008
Statut
Membre
Dernière intervention
21 octobre 2010
24 déc. 2008 à 01:24
24 déc. 2008 à 01:24
Confirmation, c'est bien à cause de turbo C.
http://c-faq.com/fp/fpnotlinked.html
Ne l'utilise plus ;)
http://c-faq.com/fp/fpnotlinked.html
Ne l'utilise plus ;)
diocool
Messages postés
367
Date d'inscription
mardi 26 février 2008
Statut
Membre
Dernière intervention
21 octobre 2010
12
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
24 déc. 2008 à 01:35
24 déc. 2008 à 01:35
Oh-la-là! ça sera dur pour moi de le laisser car c'est avec lui que j'ai appris le C.
Ce qui m'étonne quand même c'est que c'est la première fois que je rencontre ce type de problème avec Turbo C depuis 2 ans.
D'après ce que j'ai compris, il faut ajouter ce qui suit dans la déclaration et ça marche avec Turbo C:
Extern unsigned _floatconvert;
#pragma extref _floatconvert
oubien:
void forcefloat (float * p)
{ float f = * p;
forcefloat (& f);
}
/*Ne pas appeler la fonction*/
MERCI A TOUS
Ce qui m'étonne quand même c'est que c'est la première fois que je rencontre ce type de problème avec Turbo C depuis 2 ans.
D'après ce que j'ai compris, il faut ajouter ce qui suit dans la déclaration et ça marche avec Turbo C:
Extern unsigned _floatconvert;
#pragma extref _floatconvert
oubien:
void forcefloat (float * p)
{ float f = * p;
forcefloat (& f);
}
/*Ne pas appeler la fonction*/
MERCI A TOUS
23 déc. 2008 à 22:56