EXERCICE VI

Tableau dynamiques de chaînes  de caractères

(TABLEAU DE POINTEURS)

 

  1. Ecrire un programme qui lit L (L<=30) lignes de texte au maximum et le mémorise dans un tableau dynamique de chaînes  de caractères.

 

#include <stdio.h>

#include <stdlib.h>

#include <ctype.h>

#include <string.h>

#define L 30

#define N 2

char * gets_li(char* s,int n) ;

int te(char *s[]);

void out(char *s[],int l);

void trier(char *list[],int l);

void main()

 {                char *t[L];

                  int l,i;

                  l=te(t);

                  printf("Le texte au debut\n");

                  out(t,l);

                  trier(t,l);

                  printf("Le texte apres le trie lexicographiquement\n");

                  out(t,l);

                  free (t);

 }

 //entrer une ligne de texte

char * gets_li(char* s,int n)

 { char c,*p=s;

      int i=0;

      fflush(stdin);

      printf("Entrer des caracteres\n");

      while(c=getchar(),c!='\n'&&c!=EOF)

        { if(i >= n)

                    {                     n+=N;

                                          s=(char *)realloc(s,n*sizeof(char));

                                          if(s==NULL) exit(1);

                    }

                   s[i]=c;

                   i++;

        }

      s[i]='\0';

      return s;

 }

 

 

 

 //entrer tout le texte

 int te(char *s[])

  {               int i=0,l;

                  char *buf=(char *)malloc(N*sizeof(char));

                  if(buf == NULL) exit(1);

                  while(1)

                  {            printf("li %d\n",i);

                               buf=gets_li(buf,N);

                               l=strlen(buf);

                               s[i]=(char *)malloc(l+1);

                               if(s[i]==NULL)

                               { printf("Pas de place\n");

                                          exit(1);

                               }

                               strcpy(s[i++],buf);

                               printf("Ligne suivante?:O/N:");

                               fflush(stdin);

                               if(toupper (getchar())=='N'||i==L)break;

        }

       free (buf); buf=NULL;

       free (s);

       return i;

  }

//afficher le texte

 void out(char *s[],int l)

  {    int i;

                   for(i=0;i<l;i++)

                    puts(s[i]);

  }

//trie le texte

void trier(char *list[],int l)

  {    int fin,courant;

                   for(fin=l-1;fin>0;fin--)

                              { int modifie=0;

                                for(courant=0;courant<fin;courant++)

                                          if(strcmp(list[courant],list[courant+1]) > 0)

                                          {           char *temp=list[courant];

                                                      list[courant]=list[courant+1];

                                                      list[courant+1]=temp;

                                                      modifie=1;

                                          }

                                if(!modifie)break;

                              }

  }

2.    Modifier le programme de p.1 en ajoutant une fonction à afficher la plus longue lignes du texte.

3.    Modifier le programme de p.2 en ajoutant une fonction à afficher toutes les lignes, dont le premier mot est égal à un mot donné.

4.    Modifier le programme de p.3 en ajoutant la possibilité à échanger le contenu de deux lignes du texte données par leurs numéros.