2 votes

Sprintf(target, source) a un comportement différent de sprintf(target, "%s", source);

Sur le compilateur C/C++ fourni avec une plateforme PlayStation particulière, j'ai un problème avec des caractères ASCII non standard (utilisés dans des langues traduites telles que l'espagnol - grave, aigu, ce genre de choses)

char target_string[MAX_STRING_LENGTH];
char string_table[][MAX_STRING_LENGTH];

si j'utilise

sprintf( target_string, string_table[N] ); 

où la chaîne source contient un caractère avec une valeur ascii supérieure à 127 (c'est-à-dire en dessous de 0 dans un char signé), la chaîne copiée inclut le caractère ASCII non standard mais aucun autre caractère de la chaîne. Le premier caractère européen accentué est là où l'instruction sprintf abandonne, comme si la comparaison était if( char <= 0 ), fin.

si j'utilise

sprintf( target_string, "%s", string_table[N] ); 

avec la même chaîne, tout se copie correctement, comme si la comparaison était if( char == 0 ) alors fin.

Est-ce une fonctionnalité connue de sprintf? - c'est-à-dire que je ne devrais pas utiliser la version sprintf( target, source ) sans spécificateur de format car ce n'est pas une utilisation valide de la fonction - dans ce cas, pourquoi pas d'avertissements du compilateur? Ou peut-être que le compilateur légèrement modifié que Sony utilise en est la cause. Cela semble peu probable.

2voto

Exceptyon Points 1516

Si vous appelez

sprintf( target_string, string_table[N] );

alors string_table[N] sera interprété comme une "chaîne de format" (et votre application mourra horriblement s'il y a un '%' dedans. Ne le faites pas)

le problème des caractères étranges concerne l'utf-8, vous devriez utiliser swprintf et d'autres wprintf-s

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X