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
| wchar_t *DemandeChaineCaracteres() {
// Déclaration de variable(s)
size_t dAlloc=0;
size_t dPosition=0
wchar_t *pChaine=NULL;
wchar_t cCaract;
wchar_t *pt;
// Pour être sûr d'allouer ne serait-ce qu'une chaine vide
while (1) {
// Si on a atteint la taille maximale de la chaine de caractères (ce qui arrive la première fois quand dPosition=dAlloc=0)
if (dPosition == dAlloc) {
// on réalloue dynamiquement pour l'augmenter (si pChaine=NULL le realloc se comporte comme malloc)
dAlloc+=50; // On peut mettre ce 50 en macro plutôt qu'en variable, ça évite de bouffer de la RAM pour que dalle (on dirait que tu bosses chez Micro$oft)...
wchar_t *tmp=realloc(pChaine, sizeof(*tmp)*dAlloc);
if (tmp == NULL) {
free(pChaine); // Fonctionne même si pChaine est à NULL
AfficherMessageQuandReallocationNotOkChaineCaracteres(); // Lui il pourrait être sorti de cette fonction pour être mis dans la fonction appelante
return NULL;
}
pChaine=tmp;
// On place/replace le pointeur à la position de la nouvelle chaine
pt=pChaine + dPosition;
}
// Lecture buffer
cCaract=getwchar();
// Si on a fini, on sort de la boucle (le '\0' sera mis à la fin)
if (cCaract == '\n' || cCaract == 0) break;
// On insère le caractère lu à la bonne position
// On avance d'une position
*pt=cCaract;
dPostion++;
pt++;
}
// La fin de la chaine
*pt='\0';
return pChaine;
} |
Partager