[C] Opération sur un tableau
Résolu
Mr. White
-
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour à tous.
Je dois réaliser un éditeur de texte en C, avec 20 lignes et 80 caractères par ligne.
1) Je fais charger par mon programme un fichier situé dans le même dossier que mon binaire
2) Je demande quelle opération veut faire l'utilisateur
- Si l'opération à besoins du numéro de ligne je le
- A chaque fois une ligne entrée ne doit excéder 80 caractères.
Voici les fonctions que je dois implanter :
* saisie d'un nouveau texte ? E (= suppression de tous le texte)
* affichage d'une ligne ? a num
* affichage du texte ? A
* affichage du texte avec numero de ligne ? N
* suppression d'une ligne ? d num
* insertion en fin de texte ? I
* insertion avant une ligne ? i num
* modification d'une ligne ? m ligne
* affichage de toutes les lignes (avec leur numero) contenant un mot ? f mot
* remplacement dans tout le texte d'un mot par un autre ? s ancien nouveau
* enregistrer ? S
* quitter ? Q
La fonction afficher le texte fonctionne, preuve que le texte se charge.
Malheureusement le reste ne fonctionne pas, je ne parviens pas à modifier mon tableau. Avez-vous une idée de la façon dont je dois m'y prendre pour par exemple modifier, supprimer ou insérer une ligne ?
Je vous remercie pour votre précieuse aide.
Je dois réaliser un éditeur de texte en C, avec 20 lignes et 80 caractères par ligne.
1) Je fais charger par mon programme un fichier situé dans le même dossier que mon binaire
2) Je demande quelle opération veut faire l'utilisateur
- Si l'opération à besoins du numéro de ligne je le
- A chaque fois une ligne entrée ne doit excéder 80 caractères.
Voici les fonctions que je dois implanter :
* saisie d'un nouveau texte ? E (= suppression de tous le texte)
* affichage d'une ligne ? a num
* affichage du texte ? A
* affichage du texte avec numero de ligne ? N
* suppression d'une ligne ? d num
* insertion en fin de texte ? I
* insertion avant une ligne ? i num
* modification d'une ligne ? m ligne
* affichage de toutes les lignes (avec leur numero) contenant un mot ? f mot
* remplacement dans tout le texte d'un mot par un autre ? s ancien nouveau
* enregistrer ? S
* quitter ? Q
#include <stdio.h> #include <stdlib.h> #include <string.h> char text[20][80]; int main() { int i=0, num; char c[80]; char e=0; char car; char temp[80]; FILE *g; do { printf("Entrer le nom de fichier a editer :\n"); fgets(c, sizeof(c), stdin); c[strlen(c)-1] = 0; g = fopen(c, "r"); if(g == NULL) { printf("Erreur le fichier n'existe pas\n"); } } while(g == NULL) ; while(fgets (text[i], 80, g) !=NULL) i++; fclose(g); system("clear"); while (e != 'Q'){ printf("Que voulez-vous faire ? : "); scanf(" %c", &e); if(e != 'Q') { switch(e) { case 'A': /*Affichage du texte*/ for(i=0; i<20; i++) printf("%s", text[i]); break; case 'm': /*Modification d'une ligne*/ fgets(temp, sizeof(temp), stdin); printf ("Quelle ligne ? "); sscanf(temp, "%d", &num); fgets(text[num],80,stdin); break; case 'd': /*Suppression d'une ligne*/ fgets(temp, sizeof(temp), stdin); printf ("Quelle ligne ? "); sscanf(temp, "%d", &num); for(i=18; i<num; i++) strcpy(text[i], text[i+1]); break; case 'i': /*Insertion avant une ligne*/ fgets(temp, sizeof(temp), stdin); printf ("Quelle ligne ? "); sscanf(temp, "%d", &num); for(i=19; i>num; i--) strcpy(text[i], text[i-1]); break; case 'B': /*Sauver les modifications*/ break; case 'a': /*Affichage d'une ligne*/ break; case 'N': /*Affichage du texte avec les numéros de ligne*/ break; case 's': /*Remplacement dans tous le texte d'un mot par un autre*/ break; case 'I': /*Insertion en fin de texte*/ break; case 'f': /*Affichage de toutes les lignes contenant un mot*/ break; default: printf("Erreur ce choix ne fait pas partie de ceux proposes \n"); break; } } } return 0; }
La fonction afficher le texte fonctionne, preuve que le texte se charge.
Malheureusement le reste ne fonctionne pas, je ne parviens pas à modifier mon tableau. Avez-vous une idée de la façon dont je dois m'y prendre pour par exemple modifier, supprimer ou insérer une ligne ?
Je vous remercie pour votre précieuse aide.
A voir également:
- [C] Opération sur un tableau
- Tableau word - Guide
- Trier un tableau excel - Guide
- Tableau ascii - Guide
- Comment imprimer un tableau excel sur une seule page - Guide
- Tableau croisé dynamique - Guide
5 réponses
pour debuguer, fait un printf de tout ce que tu es sensé avoir lu au clavier après le fgets. Ton scanf("%c",e); peut causer des soucis de tampon clavier.
Ta suppresion de ligne est fausse (pourquoi 18 ?)
Ta suppresion de ligne est fausse (pourquoi 18 ?)
J'ai fait un :
printf(%c ", &e);
printf("%d", &num);
en fin de programme mais ça refuse de compiler :
editeur.c:93: warning: format `%c' expects type `int', but argument 2 has type `char *'
editeur.c:94: warning: format `%d' expects type `int', but argument 2 has type `int *'
Je me demandais par ailleurs si je devais pas utiliser un fscanf pour modifier mon tableau.
printf(%c ", &e);
printf("%d", &num);
en fin de programme mais ça refuse de compiler :
editeur.c:93: warning: format `%c' expects type `int', but argument 2 has type `char *'
editeur.c:94: warning: format `%d' expects type `int', but argument 2 has type `int *'
Je me demandais par ailleurs si je devais pas utiliser un fscanf pour modifier mon tableau.
printf(%c\n ", e);
printf("%d\n", num);
C'est mieux. Je crois que fgets est mieux. met des printf aussi après les fgets.
printf("%d\n", num);
C'est mieux. Je crois que fgets est mieux. met des printf aussi après les fgets.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questioncase 'm': /*Modification d'une ligne*/ fgets(temp, sizeof(temp), stdin); // tu lis sur l'entrée standard et met dans temp printf ("Quelle ligne ? ");// affichage du message sscanf(temp, "%d", &num);// tu lis le numéro de la ligne depuis temp fgets(text[num],80,stdin);// tu saisi le nouveau texte depuis l'entrée standard break;
Ce qui est tordu là dedans, c'est que tu entres le numéro de la ligne avant la demande.
attention, le printf peut être mis en buffer. C'est à dire que son affichage peut être retardé.
C'est normal qu'on te demande rien, il n'y a rien de marqué. Essai :
C'est normal qu'on te demande rien, il n'y a rien de marqué. Essai :
case 'm': /*Modification d'une ligne*/ printf ("Quelle ligne ? ");fflush(stdout);// affichage du message fgets(temp, sizeof(temp), stdin); // tu lis sur l'entrée standard et met dans temp sscanf(temp, "%d", &num);// tu lis le numéro de la ligne depuis temp printf("DEBUG : numero lu : %d\n",num);fflush(stdout); printf("entre nouvelle ligne\n");fflush(stdout); fgets(text[num],80,stdin);// tu saisi le nouveau texte depuis l'entrée standard printf("DEBUG : nouvelle ligne : %s\n",text[num]);fflush(stdout); break;
Salut Char Snipeur,
Merci pour ton aide.
Voilà ce que me renvois la console avec ton code :
A aucun moment on me demande le numéro de ligne, ça passe directement à DEBUG numero lu : 15149336
Je persiste à dire que le problème vient du fgets.
Encore merci. Comment vider le buffer stdin ?
Merci pour ton aide.
Voilà ce que me renvois la console avec ton code :
Que voulez-vous faire ? : m Quelle ligne ? DEBUG : numero lu : 15149336 entre nouvelle ligne salut Erreur de segmentation
A aucun moment on me demande le numéro de ligne, ça passe directement à DEBUG numero lu : 15149336
Je persiste à dire que le problème vient du fgets.
Encore merci. Comment vider le buffer stdin ?