Erreur compilation génerateur c++
Résolu
Utilisateur anonyme
-
Utilisateur anonyme -
Utilisateur anonyme -
Bonsoir,
J'ai voulu faire un projet personnel de génerateur de lignes (que l'utilisateur entre avec le clavier). Je suis encore un grand débutant, j'utilise Visual C++ 2008 Express, j'ai écrit ce code :
#include <stdio.h>
#include <stdlib.h>
int main()
{
char choix[80] = {0}; long ch1 = 0, ch2 = 1;
FILE* fichier = NULL;
fichier = ("C:\\GENERATOR.txt");
printf("\t CE PROGRAMME VOUS PERMET DE GENERER TOUT TYPE DE PHRASE REPETEE\n\n");
printf("Entrez la phrase : ");
scanf("%s", choix);
printf("\nEntrez le nombre de repetitions : ");
scanf("%d", &ch1);
printf("Patientez SVP\n");
while (ch2 <= ch1) {
fprintf(fichier, "%s\n", choix);
ch2++; }
system("PAUSE");
return 0;
}
le programme se compile tranquillement, et quand j'entre le nombre de répetitions, un message d'erreur apparait : Exception non gérée ... Violation d'accés à l'écriture de l'emplacement 0x.... sachant que j'ai pas dépassé 80 caractères et pas d'espace
je soupçonne à un dépassement de tampon, mais comment faire pour se résoudre . Aidez-moi SVP !!!
J'ai voulu faire un projet personnel de génerateur de lignes (que l'utilisateur entre avec le clavier). Je suis encore un grand débutant, j'utilise Visual C++ 2008 Express, j'ai écrit ce code :
#include <stdio.h>
#include <stdlib.h>
int main()
{
char choix[80] = {0}; long ch1 = 0, ch2 = 1;
FILE* fichier = NULL;
fichier = ("C:\\GENERATOR.txt");
printf("\t CE PROGRAMME VOUS PERMET DE GENERER TOUT TYPE DE PHRASE REPETEE\n\n");
printf("Entrez la phrase : ");
scanf("%s", choix);
printf("\nEntrez le nombre de repetitions : ");
scanf("%d", &ch1);
printf("Patientez SVP\n");
while (ch2 <= ch1) {
fprintf(fichier, "%s\n", choix);
ch2++; }
system("PAUSE");
return 0;
}
le programme se compile tranquillement, et quand j'entre le nombre de répetitions, un message d'erreur apparait : Exception non gérée ... Violation d'accés à l'écriture de l'emplacement 0x.... sachant que j'ai pas dépassé 80 caractères et pas d'espace
je soupçonne à un dépassement de tampon, mais comment faire pour se résoudre . Aidez-moi SVP !!!
A voir également:
- Erreur compilation génerateur c++
- Generateur mot de passe - Télécharger - Sécurité
- Erreur 0x80070643 - Accueil - Windows
- J'aime par erreur facebook notification - Forum Facebook
- Erreur 4201 france tv ✓ - Forum Réseaux sociaux
- Iptv erreur de lecture - Forum TV & Vidéo
7 réponses
Char Snipeur
Messages postés
9813
Date d'inscription
Statut
Contributeur
Dernière intervention
1 299
bien vu. Il fait même une affectation étrange sur "fichier" de type FILE* !!
Utilisateur anonyme
merci prb résolu
essaye de remplacer
scanf("%d", &ch1);
par
scanf("%l", &ch1);
puisque tu as déclaré ch1 comme un long et non un int.
scanf("%d", &ch1);
par
scanf("%l", &ch1);
puisque tu as déclaré ch1 comme un long et non un int.
pour le fclose, j'ai essayé, le prb persiste. Mais merci quand meme.
%l ? à quoi ça sert ?
%l ? à quoi ça sert ?
donc le fopen, c'est obligatoire (et le fclose il faut le mettre aussi) ça c'est sûr.
pour le % , c'est pour préciser le type de données que tu mets. %d pour un entier (type "int") et %ld ou %l je ne sais plus bien pour un entier long (puisque ch1 est de type "long"=="long int")
mais sinon concernant le problème des fichiers,
En essayant de compiler ton code j'obtiens un Warning (avertissement) :
G:\Prog\C\test\main.c [Warning] assignment from incompatible pointer type
concernant la ligne :
fichier = ("C:\\GENERATOR.txt");
comme a dit Char Sniper, ça n'a pas de sens. Le compilateur peut quand même faire son travail, mais ce genre de ligne ne veut pas dire grand chose.
fichier est de type FILE* et tu lui assignes une chaine de caractères (plus ou moins un char*) !
alors forcément quand fprintf() est appelée, il y a un problème impossible à résoudre pour le programme, qui s'attend à avoir un FILE* dans fichier, or c'est une chaine de caractère, et donc le programme ne comprend pas ce qu'il se passe. fprintf tente d'interpréter ça comme quelque chose qui n'a rien à voir, ça ne veut rien dire ---> plantage de l'application.
tu dois utiliser correctement fopen :
fichier = fopen("C:\\GENERATOR.txt", "w");
serait déjà mieux.
C'est ce que tu as fait ?
pour le % , c'est pour préciser le type de données que tu mets. %d pour un entier (type "int") et %ld ou %l je ne sais plus bien pour un entier long (puisque ch1 est de type "long"=="long int")
mais sinon concernant le problème des fichiers,
En essayant de compiler ton code j'obtiens un Warning (avertissement) :
G:\Prog\C\test\main.c [Warning] assignment from incompatible pointer type
concernant la ligne :
fichier = ("C:\\GENERATOR.txt");
comme a dit Char Sniper, ça n'a pas de sens. Le compilateur peut quand même faire son travail, mais ce genre de ligne ne veut pas dire grand chose.
fichier est de type FILE* et tu lui assignes une chaine de caractères (plus ou moins un char*) !
alors forcément quand fprintf() est appelée, il y a un problème impossible à résoudre pour le programme, qui s'attend à avoir un FILE* dans fichier, or c'est une chaine de caractère, et donc le programme ne comprend pas ce qu'il se passe. fprintf tente d'interpréter ça comme quelque chose qui n'a rien à voir, ça ne veut rien dire ---> plantage de l'application.
tu dois utiliser correctement fopen :
fichier = fopen("C:\\GENERATOR.txt", "w");
serait déjà mieux.
C'est ce que tu as fait ?
PS : je viens de vérifier, tu peux très bien laisser les %d, il n'y a pas de souci si tes nombres sont petits (mieux vaut déclarer ch1 et ch2 comme des "int" néanmoins, pas de raison que ce soient des "long", sauf si tu veut remplir ton disque dur avec ton fichier GENERATOR.txt ;) )
c'est bien un problème de fopen() !
c'est bien un problème de fopen() !
par contre il y a encore un problème.
Le problème est que scanf("%s", choix) ne va pas enregistrer la phrase complète. Dès que tu mets un espace il ne prendra que le premier mot dans "choix".
Ensuite, le second "mot" que tu auras mis dans ta phrase sera utilisé pour répondre à la question "entrez le nombre de répétition" et évidemment, ça causera un problème. Tu n'auras même pas le temps de donner toi-même un nombre de répétitions et le programme s'arretera ou fera un bug etc....
voir : http://www.siteduzero.com/tutoriel-3-35363-realiser-des-saisies-securisees-grace-a-fgets.html
Le problème est que scanf("%s", choix) ne va pas enregistrer la phrase complète. Dès que tu mets un espace il ne prendra que le premier mot dans "choix".
Ensuite, le second "mot" que tu auras mis dans ta phrase sera utilisé pour répondre à la question "entrez le nombre de répétition" et évidemment, ça causera un problème. Tu n'auras même pas le temps de donner toi-même un nombre de répétitions et le programme s'arretera ou fera un bug etc....
voir : http://www.siteduzero.com/tutoriel-3-35363-realiser-des-saisies-securisees-grace-a-fgets.html
ou tu peux voir aussi : https://forums.commentcamarche.net/forum/affich-5045469-introduire-des-phrases-en-c
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
j'ai entré fopen et fclose comme vous disez mais le prb persiste toujours voici mon nouveau code :
#include <stdio.h>
#include <stdlib.h>
int main()
{
char choix[80] = {0}; long ch1 = 0, ch2 = 1;
FILE* fichier = NULL;
fichier = fopen("C:\\GENERATOR.txt", "r+");
printf("\t CE PROGRAMME VOUS PERMET DE GENERER TOUT TYPE DE PHRASE REPETEE\n\n");
printf("Entrez la phrase : ");
scanf("%s", choix);
printf("\nEntrez le nombre de repetitions : ");
scanf("%d", &ch1);
printf("Patientez SVP\n");
while (ch2 <= ch1) {
fprintf(fichier, "%s\n", choix);
ch2++; }
fclose(fichier);//fermeture du fichier
system("PAUSE");
return 0;
}
//////////////////////////////////////////
toujours le meme phénomene, quand j'entre "ch1", j'ai meme changé scanf par fgets mais voici le résultat :
Program received signal SIGSEGV, Segmentation fault, do you want to view the backtrace. Et le programme se bloque !! que faire !
#include <stdio.h>
#include <stdlib.h>
int main()
{
char choix[80] = {0}; long ch1 = 0, ch2 = 1;
FILE* fichier = NULL;
fichier = fopen("C:\\GENERATOR.txt", "r+");
printf("\t CE PROGRAMME VOUS PERMET DE GENERER TOUT TYPE DE PHRASE REPETEE\n\n");
printf("Entrez la phrase : ");
scanf("%s", choix);
printf("\nEntrez le nombre de repetitions : ");
scanf("%d", &ch1);
printf("Patientez SVP\n");
while (ch2 <= ch1) {
fprintf(fichier, "%s\n", choix);
ch2++; }
fclose(fichier);//fermeture du fichier
system("PAUSE");
return 0;
}
//////////////////////////////////////////
toujours le meme phénomene, quand j'entre "ch1", j'ai meme changé scanf par fgets mais voici le résultat :
Program received signal SIGSEGV, Segmentation fault, do you want to view the backtrace. Et le programme se bloque !! que faire !
d'une part il faudrait mieux ouvrir ton fichier comme ceci
puisque tu ne fais qu'écrire dedans.
Ensuite teste de cette manière :
est-ce que le problème persiste lorsque tu rentres "0" pour ch1 ?
et lorsque tu rentres un seul mot (Sans espace ni signe de ponctuation) ?
parceque moi j'ai fais le même code avec "w" à la place de "r+" et ça marche (Avec un seul mot)
fichier = fopen("C:\\GENERATOR.txt", "w");
puisque tu ne fais qu'écrire dedans.
Ensuite teste de cette manière :
est-ce que le problème persiste lorsque tu rentres "0" pour ch1 ?
et lorsque tu rentres un seul mot (Sans espace ni signe de ponctuation) ?
parceque moi j'ai fais le même code avec "w" à la place de "r+" et ça marche (Avec un seul mot)