2009-10-27 31 views
5

Encontré un código confuso durante la revisión del código y estoy un poco desconcertado. Investigando un poco encontré esta situación. Escribí esta muestra de código para destacar el problema¿Debería este char estar sin firmar?

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

modo, el programador que era la corrección de errores, hizo lo siguiente:

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. 
{   
} 

Mi pregunta es si está bien para hacer el char sin firmar? Idealmente, no usaría char, pero usaría un carácter Unicode para evitar este tipo de problema, pero el software es muy viejo y no se volverá a diseñar en el corto plazo.

Estoy usando Visual Studio 2008. ispunct() se puede encontrar en ctype.h.

Respuesta

7

El yeso es correcto en este caso. De man ispunct:

Los ispunct() pruebas de función para cualquier carácter imprimible excepto para el espacio (' ') o un personaje para el que isalnum(3) es true. El valor del argumento debe ser representable como unsigned char o el valor de EOF.

+1

Lo mismo se aplica al resto de las funciones de la misma familia, por ejemplo, 'isalpha()', 'toupper()', etc. – caf

2

Es perfectamente legítimo hacer el reparto. Creo que las variables C están firmadas por defecto, pero el reparto lo hace utilizable.

+6

En realidad, si un 'char' está firmado o no está definido por la implementación. – Artelius

3

Si quiere usar ispunct, entonces no hay forma de evitarlo.

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

Eso es lo que provocó la falla de la aserción y, por lo tanto, el reparto es apropiado.

+0

encontré esa afirmación también, es por eso que levantó una bandera roja en mi proceso de revisión. No puedo ver por qué se hace dentro de crtdbg.h –