[C] Opération sur un tableau

Résolu/Fermé
Mr. White - 17 janv. 2011 à 13:30
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 19 janv. 2011 à 21:36
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

#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.


5 réponses

Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
17 janv. 2011 à 14:17
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 ?)
0
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.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
17 janv. 2011 à 15:21
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.
0
e et num sont bons :

Que voulez-vous faire ? : m
m
Quelle ligne ? 1
m
1
Le problème vient du fgets
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
17 janv. 2011 à 16:22
                  case '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.
0
En faisait :
printf ("Quelle ligne ? ");
sscanf(temp, "%d", &num);
fgets(text[num],80,stdin);
fgets(temp, sizeof(temp), stdin);
Il n'y a pas de changement, à aucun moment on me demande d'entrée la nouvelle phrase. J'ai l'impression que le fgets ne fonctionne pas.

Merci pour ton aide.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
18 janv. 2011 à 08:20
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 :
                  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;
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
18 janv. 2011 à 08:28
Bonjour,
J'ai pas tout lu.
Mais il n'y a pas besoin de fflush(stdout) dans ces cas car il y a affichage explicite.
Par contre si le fgets donne l'impression de ne pas marcher, c'est peut-être que le buffer stdin n'a pas été vidé avant. Es-tu sûr qu'il est bien vidé ?
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
18 janv. 2011 à 08:49
"il n'y a pas besoin de fflush(stdout) dans ces cas car il y a affichage explicite. "*
Explique STP.
0
Salut Char Snipeur,

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 ?
0