Justement ce qui est le plus "chiant" si vous me permettez l'expression c'est de faire la liste avec la correspondance.
Par contre je ne connais pas ta syntaxe qui liste une chaine.
J'aurais utilisé un for (int i=0;i<strlen(chaine);i++)au lieu d'un while. En sachant que string est un mot réservé j'utilise chaine à la place.
switch( chaine[i] )
{
case 'é': chaine[i] = 0x82; break;
// La liste etc...
}
Déplacer le pointeur sur la chaîne évite de la reparcourir avec strlen()... Plus rapide sur les grosses chaînes! De plus invoquer une fonction comme strlen() signifie pousser les arguments sur le stack etc... trop lent.
Par contre au lieu d'un long switch codé à la main sur les 127 caractères ASCII
étendus, je pense qu'il faudrait caster le caractère en unsigned char puis obtenir
sa représentation hexa ou octale pour remplacer chaque char concerné.
string est une classe et non un mot clé. N'a strictement aucun effet en C. À renommer en _str pour éviter tout problème en C++.
"Par contre au lieu d'un long switch codé à la main sur les 127 caractères ASCII
étendus, je pense qu'il faudrait caster le caractère en unsigned char puis obtenir
sa représentation hexa ou octale pour remplacer chaque char concerné. "
Non non et non. strlen dans une boucle. Rien de plus mortel pour les performances. De plus, une chaine se termine obligatoirement par un 0 de fin de chaine alors aussi bien chercher ce 0 plutôt que d'effectuer un calcule supplémentaire.
C++ (@++)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Ok mais priorise les pointeurs plutôt que l'indexation. On génèrera ainsi moin de code ASM.
On évitera aussi d'utiliser une variable supplémentaire, car on utilisera chaine directement.
Et puis d'ailleur, déclarer un int à même le for n'est valide qu'en C++. Génération d'une erreur en C