Bonjour,

Dans un cadre pédagogique, j'ai écrit un petit programme qui transforme les chiffres arabes (1, 2, 3...) présents dans un texte en chiffres écrits en lettres (un, deux, trois...).
Ce petit programme fonctionne correctement.

En cours de réalisation, j'ai testé de nombreuses possibilités.
J'ai finalement réussi à faire fonctionner mon petit programme en utilisant "memset (etape1, 0, 2047);" en ligne 82 plutôt que "strcpy(etape1, "");" en ligne 81.

Toujours dans un but pédagogique, j'aimerais comprendre pourquoi "strcpy(etape1, "");", en ligne 81, ne fonctionne pas.

Si "strcpy(etape1, "");" en ligne 81 ne fonctionnait jamais, je ne me poserais pas de questions mais "strcpy(etape1, "");" provoque un comportement fautif (ajout d'un caractère aléatoire devant le chiffre arabe transformés en lettres) uniquement quand le plus élevé des chiffres arabes traités est précédé de 2, 4, 5 ou 6 caractères.
Dans tous les autres cas, "strcpy(etape1, "");" en ligne 81 fonctionne aussi bien que "memset (etape1, 0, 2047);" en ligne 82.

Donc :
- Le 1er chiffre arabe traité (transformé en lettre) est toujours le plus élevé.
- Avec "strcpy(etape1, "");", en ligne 81, il y a ajout d'un caractère indésirable quand et uniquement quand, ce 1er chiffre est précédé de 2, 4, 5 ou 6 caractères.
- Si il y a plusieurs chiffres arabes à traiter, seul le 1er est affecté.
- "strcpy(etape1, "");" fonctionne quand le 1er chiffre traité est précédé de 0, 1, 3, 7 et plus caractères.
- Est-ce que quelqu'un peut m'expliquer le comportement fautif de "strcpy(etape1, "");" ?


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
static void purger(char *chaine)  //On cherche le caractère \n (touche entrée) et on le supprime.
{
  char *p = strchr(chaine, '\n');
  if (p)
  {
      *p = 0;
  }
  }
 
 
  int main()
 {
    char *entrante, *apres, *motcherche, *motremplace, *etape1, *etape2, *original;
 
    // Changer la valeur du <# si on ajoute des éléments au tableau.
  char *motcherchetemp [] = {
  "50","49","48","47","46","45","44","43","42","41",
  "40","39","38","37","36","35","34","33","32","31",
  "30","29","28","27","26","25","24","23","22","21",
  "20","19","18","17","16","15","14","13","12","11",
  "10","9","8","7","6","5","4","3","2","1","0","otcobre"};
 
 char *motremplacetemp [] = {
       "cinquante","quarante-neuf","quarante-huit","quarante-sept","quarante-six","quarante-cinq","quarante-quatre","quarante-trois","quarante-deux","quarante-et-un",
       "quarante","trente-neuf","trente-huit","trente-sept","trente-six","trente-cinq","trente-quatre","trente-trois","trente-deux","trente-et-un",
        "trente","vingt-neuf","vingt-huit","vingt-sept","vingt-six","vingt-cinq","vingt-quatre","vingt-trois","vingt-deux","vingt-et-un",
       "vingt","dix-neuf","dix-huit","dix-sept","seize","quinze","quatorze","treize","douze","onze",
       "dix","neuf","huit","sept","six","cinq","quatre","trois","deux","un","zero","octobre"};
 
    entrante = (char *)malloc(sizeof(char)*2048);
    original = (char *)malloc(sizeof(char)*2048);
    apres = (char *)malloc(sizeof(char)*2048);
    motcherche = (char *)malloc(sizeof(char)*1024);
    motremplace = (char *)malloc(sizeof(char)*1024);
    etape1 = (char *)malloc(sizeof(char)*2048);
    etape2 = (char *)malloc(sizeof(char)*2048);
 
    size_t LongApres, LongTotal, LongAvant, Pos;
    int LongMotCherche;
    //char espace [] = " ";
    int compteur = 1;
    int x = 0;
    int condi1 = 1;
 
    if (entrante == NULL || apres == NULL || motcherche == NULL || motremplace == NULL || etape1 == NULL  || etape2 == NULL)
    {
        puts ("Allocation impossible ! Banzai !");
        exit(1);
    }
 
    puts("Saisissez quelque chose d'un peu long.\nLe programme remplacera les chiffres arabes par des chiffres en lettres :");
    puts("\n");
    fgets(entrante, 2047, stdin);
    purger(entrante);
    strcpy(original, entrante);
 
 // Début du  code pour changer les chiffres arabes en chiffres en lettres.
 
 while (condi1 == 1 &&  x<52) // La valeur a laquelle est comparée x doit être égale au nombre d'éléments des tableaux.
 {
 
 motcherche = *(motcherchetemp+x);
 apres = strstr(entrante, motcherche);
 
 if (apres != NULL)
 {
 
 LongMotCherche = strlen(motcherche);
 LongApres = strlen(apres);
 LongTotal = strlen(entrante);
 LongAvant = LongTotal - LongApres;
 Pos = LongAvant+1;
 puts("\n");
 printf("Passage no - %d", compteur);
 puts("\n");
 strcpy(etape1, "");  //Pourquoi cela ne fonctionne pas avec strcpy quand LongAvant = 2 4 5 ou 6.
 //memset (etape1, 0, 2047); //Avec cette ligne memset, cela fonctionne très bien dans tous les cas.
 printf("Texte dans la variable 'etape1' avant memcpy :\n\"%s\"\n", etape1);
 puts("\n");
 memcpy(etape1, entrante, LongAvant);
 printf("Texte dans la variable 'etape1' apres memcpy :\n\"%s\"\n", etape1);
 puts("\n");
 
 
    puts("\n");
    printf("Texte original :\n\"%s\"\n", entrante);
    puts("\n");
    printf("La taille du motcherche ( %s ) est = %d.", motcherche, sizeof(motcherche));
    puts("\n");
    printf("Longueur du mot cherche stocke dans la variable 'LongMotChr' : %d", LongMotCherche);
    puts("\n");
    printf("Texte dans la variable apres :\n\"%s\"\n", apres);
    puts("\n");
    printf("Texte dans la variable apres+2 :\n\"%s\"\n", apres+2);
    puts("\n");
    printf("Longueur du texte stocke dans la variable 'LongTotal' :\n\"%d\"\n", LongTotal);
    puts("\n");
    printf("Longueur du texte stocke dans la variable 'apres' :\n\"%d\"\n", LongApres);
    puts("\n");
    printf("Longueur du texte stocke dans la variable 'LongAvant' :\n\"%d\"\n", LongAvant);
    puts("\n");
    printf("Position du debut de la chaine recherche stocke dans la variable 'Pos' :\n\"%d\"\n", Pos);
    puts("\n");
    printf("Texte dans la variable 'etape1' avant les ajouts :\n\"%s\"\n", etape1);
    puts("\n");
 
    motremplace = motcherche;
    motremplace = *(motremplacetemp+x);
 
    strcat (etape1, motremplace);
    printf("Texte dans la variable 'etape1' apres les ajouts :\n\"%s\"\n", etape1);
    puts("\n");
    memset (etape2, 0, 2047);
    strcpy(etape2, apres+LongMotCherche);
    printf("Texte dans la variable (etape2 = apres+3) :\n\"%s\"\n", etape2);
    puts("\n");
    strcat (etape1, etape2);
    printf("Resultat final obtenu par 'strcat(etape1, etape2)':\n\"%s\"\n", etape1);
    puts("\n");
    printf("Valeur de motcherche a la fin du processus:\n\"%s\"\n", motcherche);
    memset (entrante, 0, 2047);
    strcpy(entrante, etape1);
    memset (etape1, 0, 2047);
    puts("\n");
    //getchar();
    printf("Valeur de entrante apres 'strcpy(entrante, etape1)' = \"%s\"\n", entrante);
    puts("\n");
    compteur++;
 
    condi1 = 1;
    }
    else
    {
    x++;
    }
 
}
    puts("\n");
    printf("Texte original : \"%s\"", original);
    puts("\n");
    puts("\n");
    printf("Resultat apres conversion des chiffres en lettres : \"%s\"", entrante);
    puts("\n");
     return *entrante;
}
Merci d'avance aux plus malins que moi.