Question

J'ai trouvé du code déroutant lors de la révision du code et je suis un peu perplexe. En faisant des recherches, j'ai trouvé cette situation. J'ai écrit cet exemple de code pour mettre en évidence le problème

char d = '©';// this is -87,the copyright symbol , (actually its 169 unsigned)
if(ispunct(d)) // will assert. 
{           
}

Ainsi, le programmeur qui corrigeait les bogues a fait ce qui suit:

char d = '©';// this is -87,the copyright symbol , (actually its 169 unsigned)
if(ispunct((unsigned char)d)) // will not assert, because it will be 169.
{           
}

Ma question est de savoir s'il est correct de ne pas signer le caractère char ? Idéalement, je ne voudrais pas utiliser char mais utiliser un caractère Unicode pour éviter ce genre de problème, mais le logiciel est très ancien et ne sera pas réorganisé de si tôt.

J'utilise Visual Studio 2008. ispunct () se trouve dans ctype.h .

Était-ce utile?

La solution

La distribution est correcte dans ce cas. De man ispunct :

  

La fonction ispunct () teste tout caractère d'impression à l'exception de l'espace.   ( '' ) ou un caractère pour lequel isalnum (3) est vrai . La valeur de la   l'argument doit être représentable sous la forme d'un caractère non signé ou de la valeur de EOF .

Autres conseils

Si vous souhaitez utiliser ispunct , vous ne pouvez pas y échapper.

_ASSERTE((unsigned)(c + 1) <= 256);

C’est la raison pour laquelle l’assertion a échoué et, par conséquent, la distribution est appropriée.

Il est parfaitement légitime de faire le casting. Je crois que les variables C sont signées par défaut mais la distribution le rend utilisable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top