Codage: tu utiliseras 2 pointeurs: un pointeur de lecture et un pointeur d'écriture. Bien évidemment tu travailleras sur la même chaîne puisque la chaîne compressée est plus courte ou identique à la chaîne non-compressée.
Donc tu positionnes tes 2 pointeurs sur le 1er espace de ta chaîne (strchr() est faite pour ça). Ensuite, tu fais avancer ton pointeur de lecture tant que tu lis des espaces et tu comptes combien il y en a. Puis tu écris à l'emplacement positionné par le pointeur d'écriture '%n' (n étant le nombre d'espaces) et tu recommences le tout.
Dès que "strchr()" ne trouve plus d'espace, tu clôtures ta chaîne avec un '\0' et voilà pour le codage.
Décodage: Un peu plus compliqué car la chaîne décodée sera plus longue que la chaîne codée donc il te faudra créer la chaîne décodée à coups de realloc pour l'agrandir au fur et à mesure, à moins que tu ne décides de faire une 1ère passe pour calculer la longueur de la chaîne décompressée en comptant les "%n". A toi de voir
Donc là, il te faut juste un seul pointeur et un indice de progression. Le pointeur servira à lire la chaîne compressée et l'indice servira à écrire dans la chaîne non compressée. Pourquoi utiliser un indice et pas un pointeur ? Parce que le realloc est suceptible de déplacer la chaîne décompressée donc si on a un pointeur et que la chaîne est déplacée, le pointeur pointe vers plus rien de valide. On peut aussi recalculer le pointeur lors du realloc mais autant passer par un indice.
Donc le pointeur de lecture lit la chaîne compressée tant qu'il y a du caractère et l'indice sert à copier ce caractère dans la chaîne décompressée. Bien gérer le realloc s'il n'y a plus assez de place pour la copie.
Puis dès que tu trouves un caractère spécial, tu lis le nombre qui suit et dans la chaîne décompressée tu écris autant d'espace qu'il faut et tu fais varier l'indice en conséquence. Puis tu repars sur la lecture de la chaîne compressée jusqu'à trouver le '\0' final.
Tu risques d'avoir un problème lors de la compression dans le cas où t'aurais le caractère '%' dans la chaîne initiale. Une solution de secours serait de le doubler dans la chaîne compressée mais dans ce cas là, la chaîne compressée peut être plus longue que la chaîne initiale donc plus question d'utiliser la même chaîne. Toi seul peut décider de prendre ce cas en compte ou pas...
Message édité par Sve@r le 31-01-2007 à 18:35:48
---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.