godar8
Messages postés3Date d'inscriptionmercredi 17 janvier 2007StatutMembreDernière intervention18 janvier 2007
-
18 janv. 2007 à 15:41
godar8
Messages postés3Date d'inscriptionmercredi 17 janvier 2007StatutMembreDernière intervention18 janvier 2007
-
18 janv. 2007 à 17:15
j'ai fait un programe d'editeur de texte en c pour cretion document , ajout , supprimer etc
mais j'ai un petit mon document ne s'affiche pas pour que je puisse saisr je ne vois pas d'ou vient l'erreur
alors si il y en a qui peuvent m'aider voici mon programe
typedef struct tab //structure tableau de chaine de caractere
{
int index;
char chaine[100];
}tab;
//initialisation de index
tab phrase[100]; //declaration du tableau
//phrase[0].index=0;
int numeroligne = 0; //numero de ligne
int nombreligne; //Nombre de ligne
Tligne *document,*deb;
// afficher le Menu
int menu()
{
/*Declaration des variables*/
int reponse;
do
{
system("cls");
printf(" MENU PRINCIPAL\n");
printf("\n");
printf("1\t\t\tCreer le document\n");
printf("2\t\t\tEcrire des paragraphes\n");
printf("3\t\t\tInsertion d'un paragraphe\n");
printf("4\t\t\tSuppression d'un paragraphe\n");
printf("5\t\t\tDeplacement d'un paragraphe\n");
printf("6\t\t\tAffichage du document\n");
printf("7\t\t\tRecherche d'un mot dans le document\n");
printf("8\t\t\tInsertion d'un fichier dans un autre\n");
printf("9\t\t\tEnregistrer le document\n");
printf("10\t\t\tOuvrir le document\n");
printf("11\t\t\tQuitter \n\n");
//Fonction affiche
void affiche(Tligne *document,int ligne)
{
/*Declaration de variable*/
Tligne *ptr=document;
int i = 1;
ptr=ptr->suiv;
//Parcour toutes les lignes
while(i<(ligne+1))
{
printf("%d \t %s",phrase[i].index,ptr->ligne);
ptr=ptr->suiv;
i++;
}
system("pause>NULL");
}
//Insertion d'un ligne
Tligne* insertion(Tligne *document,char *chaine,int position,int nonbreligne, int taille)
{
/*Declaration de Variables*/
int i_s;
int nombreligne;
Tligne *ptr=document,
*av=NULL;
Tligne *nouv=(Tligne*)malloc(sizeof(Tligne));
while (nombreligne>=position)
{
phrase[nombreligne].index=nombreligne;
nombreligne--;
}
for (i_s=0;i_ssuiv;
}
av=ptr->prec;
av->suiv=nouv;
nouv->prec=av;
nouv->suiv=ptr;
ptr->prec=nouv;
nouv->ligne=(char*)malloc(4*taille);
nouv->ligne=chaine;
return document;
}
//Effacer une ligne
Tligne *efface(Tligne *document, int position)
{
/*Declaration de variables*/
Tligne *supression=document,*avant,*apres;
int a=0;
while (asuiv;
a++;
}
avant=supression->prec;
apres=supression->suiv;
avant->suiv=apres;
apres->prec=avant;
free(supression);
return document;
}
//Deplacer
Tligne *deplace(Tligne *document, int deplace, int inser, int nombreligne)
{
/*Declaration de variables*/
Tligne *supression = document;
int a=0;
int longueur;
char *chaine;
while (a<deplace)
{
supression=supression->suiv;
a++;
}
//Rechercher un mot dans une ligne
void recherche(char * mot)
{
/*Declaration des Variables*/
int i = 0, nombreligne;
while (i<nombreligne)
{
if (strstr(phrase[i].chaine,mot)!=0)
{
printf("\ntrouve : %s",phrase[i].chaine);
}
i++;
}
}
//Enregistrement du fichier
void enregistre (char *fichier, Tligne *document, int nombreligne)
{
/*Declaration de Variable*/
FILE *stream;
Tligne *ptr = document;
int a=0;
if ((stream = fopen(fichier,"w"))==NULL)
{
perror("fopen"); //affchage d'un message d'erreur
exit(-1);
}
//flush de l'entree
fflush(stdin);
ptr=ptr->suiv;
while(a<(nombreligne))
{
fprintf(stream,"%s",ptr->ligne);
ptr=ptr->suiv;
a++;
}
fclose(stream);
}
//Ouverture du fichier
Tligne *ouvrirdoc(char *fichier,Tligne *docu)
{
/*Declaration des varariables*/
int numeroligne;
int longueur;
char *chaine;
FILE *stream1;
int var;
numeroligne = 0;
var = numeroligne;
chaine = NULL;
//Menu principal
int main()
{
/*Declaration des variables*/
char nomfic[10];
int taille;
int reponse;
int numero,lignesup,lignedeplace,ligneinser,test,i=0;
char *ptr;
int compare;
char mot[100];
do
{
system("cls");
reponse = menu();
switch(reponse)
{
case 1:
document=nouveau_document(document);
break;
case 2 :
do
{
system("cls");
printf("Donner le paragraphe : ");
fflush(stdin);
//gets(phrase[i].chaine); //sur pc
scanf("%s",phrase[i].chaine);
compare = strcmp(phrase[i].chaine,"&&&"); //Comparaison paraison d'un chaine de caractère.
taille = strlen(phrase[i].chaine); //Longueur de la chaine
if (compare==0)
{
printf("\n\nFin de saisie du texte\n");
}
else
{
strcpy(phrase[i].chaine,strcat(phrase[i].chaine,"\n"));
ptr = phrase[i].chaine;
document=ajouter_paragraphe(document,ptr,taille,nombreligne);
i++;
phrase[i].index = i;
nombreligne++;
getchar();
}
}while (compare!=0);
break;
case 3 :
system("cls");
printf("Donnez la ligne à inserer : ");
fflush(stdin);
//gets(phrase[i].chaine);//sur pc
scanf("\n%s",phrase[i].chaine);
taille=strlen(phrase[i].chaine);
printf("donnez le numero de la ligne d'insertion");
scanf("\n%d",&numero);
strcpy(phrase[i].chaine,strcat(phrase[i].chaine,"\n"));
ptr=phrase[i].chaine;
printf("\nAvant fontction : %s,%d,%d%d\n",ptr,numero,nombreligne,taille);
nombreligne++;
document=insertion(document,ptr,numero,nombreligne,taille);
getchar();
break;
case 4:
system("cls");
fflush(stdin);
printf("Donner le numero de la ligne a effacer :\n");
scanf("%d",&lignesup);
nombreligne--;
document=efface(document,lignesup);
getchar();
fflush(stdin);
break;
case 5:
system("cls");
fflush(stdin);
printf("\nDonnez le numero de ligne a deplacer :\n");
scanf("%d",&lignedeplace);
fflush(stdin);
printf("\nDonnez le numero de la ligne d'insertion :\n");
scanf("%d",&ligneinser);
document=deplace(document,lignedeplace,ligneinser,nombreligne);
getchar();
fflush(stdin);
break;
case 6 :
system("cls");
affiche(document,nombreligne);
getchar();
break;
case 7 :
system("cls");
printf("\nentrez le mot a rechercher ?\n");
printf("=> ");
scanf("%s",mot);
printf("\n%s\n",mot);
recherche(mot);
break;
case 9:
system("cls");
printf("Saisir le nom du document : ");
scanf("%s",nomfic);
enregistre(nomfic,document,nombreligne);
getchar();
break;
case 10:
test = nombreligne;
printf("le nombre de ligne avant l'ouverture : %d",test);
document=ouvrirdoc("doc.txt",document);
printf("le nombre de ligne apres l'ouverture : %d",test);
getchar();
break;
case 11 :
printf("vous quittez le programme");
break;
cs_vicenzo
Messages postés178Date d'inscriptionmardi 16 août 2005StatutMembreDernière intervention25 août 20101 18 janv. 2007 à 16:41
Commence d'abord par tester tes pointeurs !!!!!
J'ai testé ton code et je ne compte plus l'accès à des membres d'une strucure via un pointeur null qui ton planter le bazar ! 'ex. : dans le menu, choisir 10 avant avant de choisir 1...).
De plus, ton tableau 'phrase' est déclaré avec une taille de 100. Tu ne vérifie même pas cette valeur quand tu incremente ta variable 'numeroligne' donc tu dépasse du tableau et tu écrase la mémoire qui est à coté.... buffer overflow par la pratique ....
Morale de l'histoire : En C, toujours tester ses pointeurs et les tailles des tableaux !!!!!!
typedef struct tab //structure tableau de chaine de caractere
{
int index;
char chaine[100];
}tab;
//initialisation de index
tab phrase[100]; //declaration du tableau
for phrase
index=0;
int numeroligne = 0; //numero de ligne
int nombreligne; //Nombre de ligne
Tligne *document,*deb;
// afficher le Menu
int menu()
{
/*Declaration des variables*/
int reponse;
do
{
system("cls");
printf(" MENU PRINCIPAL\n");
printf("\n");
printf("1\t\t\tCreer le document\n");
printf("2\t\t\tEcrire des paragraphes\n");
printf("3\t\t\tInsertion d'un paragraphe\n");
printf("4\t\t\tSuppression d'un paragraphe\n");
printf("5\t\t\tDeplacement d'un paragraphe\n");
printf("6\t\t\tAffichage du document\n");
printf("7\t\t\tRecherche d'un mot dans le document\n");
printf("8\t\t\tInsertion d'un fichier dans un autre\n");
printf("9\t\t\tEnregistrer le document\n");
printf("10\t\t\tOuvrir le document\n");
printf("11\t\t\tQuitter \n\n");
//Fonction affiche
void affiche(Tligne *document,int ligne)
{
/*Declaration de variable*/
Tligne *ptr=document;
int i = 1;
ptr=ptr->suiv;
//Parcour toutes les lignes
while(i<(ligne+1))
{
printf("%d \t %s",phrase[i].index,ptr->ligne);
ptr=ptr->suiv;
i++;
}
system("pause>NULL");
}
//Insertion d'un ligne
Tligne* insertion(Tligne *document,char *chaine,int position,int nonbreligne, int taille)
{
/*Declaration de Variables*/
int i_s;
int nombreligne;
Tligne *ptr=document,
*av=NULL;
Tligne *nouv=(Tligne*)malloc(sizeof(Tligne));
while (nombreligne>=position)
{
phrase[nombreligne].index=nombreligne;
nombreligne--;
}
for (i_s=0;i_ssuiv;
}
av=ptr->prec;
av->suiv=nouv;
nouv->prec=av;
nouv->suiv=ptr;
ptr->prec=nouv;
nouv->ligne=(char*)malloc(4*taille);
nouv->ligne=chaine;
return document;
}
//Effacer une ligne
Tligne *efface(Tligne *document, int position)
{
/*Declaration de variables*/
Tligne *supression=document,*avant,*apres;
int a=0;
while (asuiv;
a++;
}
avant=supression->prec;
apres=supression->suiv;
avant->suiv=apres;
apres->prec=avant;
free(supression);
return document;
}
//Deplacer
Tligne *deplace(Tligne *document, int deplace, int inser, int nombreligne)
{
/*Declaration de variables*/
Tligne *supression = document;
int a=0;
int longueur;
char *chaine;
while (a<deplace)
{
supression=supression->suiv;
a++;
}
//Rechercher un mot dans une ligne
void recherche(char * mot)
{
/*Declaration des Variables*/
int i = 0, nombreligne;
while (i<nombreligne)
{
if (strstr(phrase[i].chaine,mot)!=0)
{
printf("\ntrouve : %s",phrase[i].chaine);
}
i++;
}
}
//Enregistrement du fichier
void enregistre (char *fichier, Tligne *document, int nombreligne)
{
/*Declaration de Variable*/
FILE *stream;
Tligne *ptr = document;
int a=0;
if ((stream = fopen(fichier,"w"))==NULL)
{
perror("fopen"); //affchage d'un message d'erreur
exit(-1);
}
//flush de l'entree
fflush(stdin);
ptr=ptr->suiv;
while(a<(nombreligne))
{
fprintf(stream,"%s",ptr->ligne);
ptr=ptr->suiv;
a++;
}
fclose(stream);
}
//Ouverture du fichier
Tligne *ouvrirdoc(char *fichier,Tligne *docu)
{
/*Declaration des varariables*/
int numeroligne;
int longueur;
char *chaine;
FILE *stream1;
int var;
numeroligne = 0;
var = numeroligne;
chaine = NULL;
//Menu principal
int main()
{
/*Declaration des variables*/
char nomfic[10];
int taille;
int reponse;
int numero,lignesup,lignedeplace,ligneinser,test,i=0;
char *ptr;
int compare;
char mot[100];
do
{
system("cls");
reponse = menu();
switch(reponse)
{
case 1:
document=nouveau_document(document);
break;
case 2 :
do
{
system("cls");
printf("Donner le paragraphe : ");
fflush(stdin);
//gets(phrase[i].chaine); //sur pc
scanf("%s",phrase[i].chaine);
compare = strcmp(phrase[i].chaine,"&&&"); //Comparaison paraison d'un chaine de caractère.
taille = strlen(phrase[i].chaine); //Longueur de la chaine
if (compare==0)
{
printf("\n\nFin de saisie du texte\n");
}
else
{
strcpy(phrase[i].chaine,strcat(phrase[i].chaine,"\n"));
ptr = phrase[i].chaine;
document=ajouter_paragraphe(document,ptr,taille,nombreligne);
i++;
phrase[i].index = i;
nombreligne++;
getchar();
}
}while (compare!=0);
break;
case 3 :
system("cls");
printf("Donnez la ligne à inserer : ");
fflush(stdin);
//gets(phrase[i].chaine);//sur pc
scanf("\n%s",phrase[i].chaine);
taille=strlen(phrase[i].chaine);
printf("donnez le numero de la ligne d'insertion");
scanf("\n%d",&numero);
strcpy(phrase[i].chaine,strcat(phrase[i].chaine,"\n"));
ptr=phrase[i].chaine;
printf("\nAvant fontction : %s,%d,%d%d\n",ptr,numero,nombreligne,taille);
nombreligne++;
document=insertion(document,ptr,numero,nombreligne,taille);
getchar();
break;
case 4:
system("cls");
fflush(stdin);
printf("Donner le numero de la ligne a effacer :\n");
scanf("%d",&lignesup);
nombreligne--;
document=efface(document,lignesup);
getchar();
fflush(stdin);
break;
case 5:
system("cls");
fflush(stdin);
printf("\nDonnez le numero de ligne a deplacer :\n");
scanf("%d",&lignedeplace);
fflush(stdin);
printf("\nDonnez le numero de la ligne d'insertion :\n");
scanf("%d",&ligneinser);
document=deplace(document,lignedeplace,ligneinser,nombreligne);
getchar();
fflush(stdin);
break;
case 6 :
system("cls");
affiche(document,nombreligne);
getchar();
break;
case 7 :
system("cls");
printf("\nentrez le mot a rechercher ?\n");
printf("=> ");
scanf("%s",mot);
printf("\n%s\n",mot);
recherche(mot);
break;
case 9:
system("cls");
printf("Saisir le nom du document : ");
scanf("%s",nomfic);
enregistre(nomfic,document,nombreligne);
getchar();
break;
case 10:
test = nombreligne;
printf("le nombre de ligne avant l'ouverture : %d",test);
document=ouvrirdoc("doc.txt",document);
printf("le nombre de ligne apres l'ouverture : %d",test);
getchar();
break;
case 11 :
printf("vous quittez le programme");
break;
typedef struct tab //structure tableau de chaine de caractere
{
int index;
char chaine[100];
}tab;
//initialisation de index
tab phrase[100]; //declaration du tableau
for phrase
index=0;
int numeroligne = 0; //numero de ligne
int nombreligne; //Nombre de ligne
Tligne *document,*deb;
// afficher le Menu
int menu()
{
/*Declaration des variables*/
int reponse;
do
{
system("cls");
printf(" MENU PRINCIPAL\n");
printf("\n");
printf("1\t\t\tCreer le document\n");
printf("2\t\t\tEcrire des paragraphes\n");
printf("3\t\t\tInsertion d'un paragraphe\n");
printf("4\t\t\tSuppression d'un paragraphe\n");
printf("5\t\t\tDeplacement d'un paragraphe\n");
printf("6\t\t\tAffichage du document\n");
printf("7\t\t\tRecherche d'un mot dans le document\n");
printf("8\t\t\tInsertion d'un fichier dans un autre\n");
printf("9\t\t\tEnregistrer le document\n");
printf("10\t\t\tOuvrir le document\n");
printf("11\t\t\tQuitter \n\n");
//Fonction affiche
void affiche(Tligne *document,int ligne)
{
/*Declaration de variable*/
Tligne *ptr=document;
int i = 1;
ptr=ptr->suiv;
//Parcour toutes les lignes
while(i<(ligne+1))
{
printf("%d \t %s",phrase[i].index,ptr->ligne);
ptr=ptr->suiv;
i++;
}
system("pause>NULL");
}
//Insertion d'un ligne
Tligne* insertion(Tligne *document,char *chaine,int position,int nonbreligne, int taille)
{
/*Declaration de Variables*/
int i_s;
int nombreligne;
Tligne *ptr=document,
*av=NULL;
Tligne *nouv=(Tligne*)malloc(sizeof(Tligne));
while (nombreligne>=position)
{
phrase[nombreligne].index=nombreligne;
nombreligne--;
}
for (i_s=0;i_ssuiv;
}
av=ptr->prec;
av->suiv=nouv;
nouv->prec=av;
nouv->suiv=ptr;
ptr->prec=nouv;
nouv->ligne=(char*)malloc(4*taille);
nouv->ligne=chaine;
return document;
}
//Effacer une ligne
Tligne *efface(Tligne *document, int position)
{
/*Declaration de variables*/
Tligne *supression=document,*avant,*apres;
int a=0;
while (asuiv;
a++;
}
avant=supression->prec;
apres=supression->suiv;
avant->suiv=apres;
apres->prec=avant;
free(supression);
return document;
}
//Deplacer
Tligne *deplace(Tligne *document, int deplace, int inser, int nombreligne)
{
/*Declaration de variables*/
Tligne *supression = document;
int a=0;
int longueur;
char *chaine;
while (a<deplace)
{
supression=supression->suiv;
a++;
}
//Rechercher un mot dans une ligne
void recherche(char * mot)
{
/*Declaration des Variables*/
int i = 0, nombreligne;
while (i<nombreligne)
{
if (strstr(phrase[i].chaine,mot)!=0)
{
printf("\ntrouve : %s",phrase[i].chaine);
}
i++;
}
}
//Enregistrement du fichier
void enregistre (char *fichier, Tligne *document, int nombreligne)
{
/*Declaration de Variable*/
FILE *stream;
Tligne *ptr = document;
int a=0;
if ((stream = fopen(fichier,"w"))==NULL)
{
perror("fopen"); //affchage d'un message d'erreur
exit(-1);
}
//flush de l'entree
fflush(stdin);
ptr=ptr->suiv;
while(a<(nombreligne))
{
fprintf(stream,"%s",ptr->ligne);
ptr=ptr->suiv;
a++;
}
fclose(stream);
}
//Ouverture du fichier
Tligne *ouvrirdoc(char *fichier,Tligne *docu)
{
/*Declaration des varariables*/
int numeroligne;
int longueur;
char *chaine;
FILE *stream1;
int var;
numeroligne = 0;
var = numeroligne;
chaine = NULL;
//Menu principal
int main()
{
/*Declaration des variables*/
char nomfic[10];
int taille;
int reponse;
int numero,lignesup,lignedeplace,ligneinser,test,i=0;
char *ptr;
int compare;
char mot[100];
do
{
system("cls");
reponse = menu();
switch(reponse)
{
case 1:
document=nouveau_document(document);
break;
case 2 :
do
{
system("cls");
printf("Donner le paragraphe : ");
fflush(stdin);
//gets(phrase[i].chaine); //sur pc
scanf("%s",phrase[i].chaine);
compare = strcmp(phrase[i].chaine,"&&&"); //Comparaison paraison d'un chaine de caractère.
taille = strlen(phrase[i].chaine); //Longueur de la chaine
if (compare==0)
{
printf("\n\nFin de saisie du texte\n");
}
else
{
strcpy(phrase[i].chaine,strcat(phrase[i].chaine,"\n"));
ptr = phrase[i].chaine;
document=ajouter_paragraphe(document,ptr,taille,nombreligne);
i++;
phrase[i].index = i;
nombreligne++;
getchar();
}
}while (compare!=0);
break;
case 3 :
system("cls");
printf("Donnez la ligne à inserer : ");
fflush(stdin);
//gets(phrase[i].chaine);//sur pc
scanf("\n%s",phrase[i].chaine);
taille=strlen(phrase[i].chaine);
printf("donnez le numero de la ligne d'insertion");
scanf("\n%d",&numero);
strcpy(phrase[i].chaine,strcat(phrase[i].chaine,"\n"));
ptr=phrase[i].chaine;
printf("\nAvant fontction : %s,%d,%d%d\n",ptr,numero,nombreligne,taille);
nombreligne++;
document=insertion(document,ptr,numero,nombreligne,taille);
getchar();
break;
case 4:
system("cls");
fflush(stdin);
printf("Donner le numero de la ligne a effacer :\n");
scanf("%d",&lignesup);
nombreligne--;
document=efface(document,lignesup);
getchar();
fflush(stdin);
break;
case 5:
system("cls");
fflush(stdin);
printf("\nDonnez le numero de ligne a deplacer :\n");
scanf("%d",&lignedeplace);
fflush(stdin);
printf("\nDonnez le numero de la ligne d'insertion :\n");
scanf("%d",&ligneinser);
document=deplace(document,lignedeplace,ligneinser,nombreligne);
getchar();
fflush(stdin);
break;
case 6 :
system("cls");
affiche(document,nombreligne);
getchar();
break;
case 7 :
system("cls");
printf("\nentrez le mot a rechercher ?\n");
printf("=> ");
scanf("%s",mot);
printf("\n%s\n",mot);
recherche(mot);
break;
case 9:
system("cls");
printf("Saisir le nom du document : ");
scanf("%s",nomfic);
enregistre(nomfic,document,nombreligne);
getchar();
break;
case 10:
test = nombreligne;
printf("le nombre de ligne avant l'ouverture : %d",test);
document=ouvrirdoc("doc.txt",document);
printf("le nombre de ligne apres l'ouverture : %d",test);
getchar();
break;
case 11 :
printf("vous quittez le programme");
break;