OVH Cloud OVH Cloud

Tableau de caracteres et pointeurs

25 réponses
Avatar
bpascal123
Bonjour,
J'apprends le C =E0 partir d'un tutorial en ligne. Je n'arrive pas =E0 un
r=E9sultat pour un exercice dont la solution de l'auteur ne fonctionne
pas non plus. Vous pouvez voir sur l'exercice et la solution que je ne
parviens pas =E0 impl=E9menter sur http://www.ltam.lu/cours-c// ... ex.
9.22.

Voici le code qui ne veut pas tourner alors que =E7a me semble coh=E9rent.
J'y ajoute des fonctions car j'ai d=E9j=E0 parcouru le chapitre fonction
et j'essaie de r=E9soudre les questions de l'allocation dynamique avec
les difficult=E9s du chapitre des fonctions...

/*
Ecrire un programme qui lit 4 mots au clavier (longueur maximale: 10
caract=E8res) et attribue leurs adresses =E0 un tableau de pointeurs pMot.
Copier les mots selon l'ordre lexicographique en une seule 'phrase'
dont l'adresse est affect=E9e =E0 un pointeur pPhr. R=E9server l'espace
n=E9cessaire =E0 la PHRASE avant de copier les mots. Lib=E9rer la m=E9moire
occup=E9e par chaque mot apr=E8s l'avoir copi=E9. Utiliser les fonctions de
<string>.
*/

#include <stdio.h> /* printf fgets */
#include <stdlib.h> /* malloc */
#include <string.h> /* strlen strcpy strcmp strcat */

#define MAXLIG 4 /* nbr de ligne max */
#define MAXLET 10 /* nbr de lettre max */

void ReadPhr(char *fpPhr[], int nmax) ;
void WritePhr(char *fpPhr[], int nmax) ;
void WriteMot(char *fpPhr[], char *fpMot, int nmax) ;
void AlphaPhr(char *fpPhr[], int nmax) ;

int main(void)
{
char *pPhr[MAXLIG] ;
char *pMot =3D 0 ;


ReadPhr(pPhr, MAXLIG) ;
WritePhr(pPhr, MAXLIG) ;
AlphaPhr(pPhr, MAXLIG) ;
WriteMot(pPhr, pMot, MAXLIG) ;

printf("\n\n") ;
return 0 ;
}

void ReadPhr(char *fpPhr[], int nmax)
{
char Intro[MAXLET] ;
int i ;

printf("\n\nEntrez des mots, fin avec [enter] : \n") ;

for ( i =3D 0 ; i < nmax ; i++ )
{
printf("\nEntree %d%s : ", i+1, (i =3D=3D 0) ? "ere" : "eme") ;
fgets(Intro, MAXLET, stdin) ;

*(fpPhr+i) =3D malloc( strlen(Intro)+1) ;

if ( *(fpPhr+i ) )
strcpy( *(fpPhr+i), Intro ) ;
else
{
printf("\nAllocation error\n") ;
exit(-1) ;
}
}
}

void WritePhr(char *fpPhr[], int nmax)
{
int i ;

printf("\n\nAFFICHAGE : \n") ;
for ( i =3D 0 ; i < nmax ; i++ )
printf("\n%s", *(fpPhr+i) ) ;
}

void WriteMot(char *fpPhr[], char *fpMot, int nmax)
{
int i ;
int sz =3D 0 ;

for ( i =3D 0 ; i < nmax ; i++ )
sz +=3D strlen( fpPhr[i] ) ;

printf("\nTaille totale : %d", sz) ;
}

void AlphaPhr( char *fpPhr[], int nmax)
{
void AlphaSwap(char *fpPhr[], int var_i, int var_j) ;
int i, j ;
int pm ;

for ( i =3D 0 ; i < nmax-1 ; i++ )
{
pm =3D i ;
for ( j =3D i+1 ; j < nmax ; j++ )
if ( strcmp( *(fpPhr+pm), *(fpPhr+j) ) > 0 )
pm =3D j ;

AlphaSwap(fpPhr, i, pm) ;
}
}

void AlphaSwap(char *fpPhr[], int var_i, int var_j)
{
char *aide ;

aide =3D fpPhr[var_i] ;
fpPhr[var_i] =3D fpPhr[var_j] ;
fpPhr[var_j] =3D aide ;
}

-0-
Comme je ne comprends pa l'algorithme de tri alphab=E9tique de l'auteur
pour cet exercice, j'ai fait appel au tri par selection du maximum...

Merci,
Pascal

5 réponses

1 2 3
Avatar
bpascal123
On Aug 11, 1:26 pm, (Marc Espie) wrote:
In article .com>,

wrote:
>int ReadNumbOfItems(int nmax)
>{
>            int n ;

>            printf("Enter the number of records : ") ;

>            scanf("%d", &n) ;

>    return n ;
>}

Pas de verif de la valeur de retour de scanf -> pour moi ca suffit,
je ne lis pas plus loin. C'est une perte de temps.



Avec mon niveau, je ne veux pas comprendre cette syntaxe un peu
déroutante, il me semblerait que c'est la solution.
scanf("%d%*[^n] --- merci à l'auteur de "Scanf démythifiée" Xavier
Renault
Sujet clos définitivement?
Avatar
bpascal123
On Aug 11, 1:26 pm, (Marc Espie) wrote:
In article .com>,

wrote:
>int ReadNumbOfItems(int nmax)
>{
>            int n ;

>            printf("Enter the number of records : ") ;

>            scanf("%d", &n) ;

>    return n ;
>}

Pas de verif de la valeur de retour de scanf -> pour moi ca suffit,
je ne lis pas plus loin. C'est une perte de temps.



Avec mon niveau, je ne veux pas comprendre cette syntaxe un peu
déroutante, il me semblerait que c'est la solution.
scanf("%d%*[^n] --- merci à l'auteur de "Scanf démythifiée" Xavier
Renault
Sujet clos définitivement?
Avatar
bpascal123
On Aug 11, 1:26 pm, (Marc Espie) wrote:
In article .com>,

wrote:
>int ReadNumbOfItems(int nmax)
>{
>            int n ;

>            printf("Enter the number of records : ") ;

>            scanf("%d", &n) ;

>    return n ;
>}

Pas de verif de la valeur de retour de scanf -> pour moi ca suffit,
je ne lis pas plus loin. C'est une perte de temps.



Avec mon niveau, je ne veux pas comprendre cette syntaxe un peu
déroutante, il me semblerait que c'est la solution.
scanf("%d%*[^n] --- merci à l'auteur de "Scanf démythifiée" Xavier
Renault
Sujet clos définitivement?
Avatar
bpascal123
double poste = signal wifi faible et actualiser pour récupérer le
message quand je pense que l'ordinateur cherche toujours le signal me
joue des tours...
Avatar
bpascal123
On Aug 15, 12:53 am, ""
wrote:
On Aug 11, 1:26 pm, (Marc Espie) wrote:



> In article ps.com>,

> wrote:
> >int ReadNumbOfItems(int nmax)
> >{
> >            int n ;

> >            printf("Enter the number of records : ") ;

> >            scanf("%d", &n) ;

> >    return n ;
> >}

> Pas de verif de la valeur de retour de scanf -> pour moi ca suffit,
> je ne lis pas plus loin. C'est une perte de temps.

Avec mon niveau, je ne veux pas comprendre cette syntaxe un peu
déroutante, il me semblerait que c'est la solution.
scanf("%d%*[^n] --- merci à l'auteur de "Scanf démythifiée" Xavier
Renault
Sujet clos définitivement?



Ne vous fatiguez pas à répondre,scanf("%d%*[^n] n'est pas la réponse .
Je vais ouvrir une autre discussion car il s'agit d'un autre exercice,
je vais voir si je trouve une solution avant de poster
...merci
1 2 3