2009-10-27 21 views
5

Ho trovato un codice confuso durante la revisione del codice e sono un po 'perplesso. Facendo qualche ricerca ho trovato questa situazione. Ho scritto questo esempio di codice per evidenziare il problemaQuesto carattere dovrebbe essere non firmato?

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

modo, il programmatore che era bug fixing, fatto quanto segue:

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

La mia domanda è se è OK per fare il unsigned char? Idealmente, non utilizzerei lo char ma uso un char Unicode per evitare questo tipo di problema, ma il software è molto vecchio e non verrà reingegnerizzato in tempi brevi.

Sto utilizzando Visual Studio 2008. ispunct() può essere trovato in ctype.h.

risposta

7

Il cast è corretto in questo caso. Da man ispunct:

Le ispunct() test di funzionalità per qualsiasi carattere stampabile tranne lo spazio (' ') o un carattere per il quale è isalnum(3)true. Il valore dell'argomento deve essere rappresentabile come unsigned char o il valore di EOF.

+1

Lo stesso vale per il resto delle funzioni della stessa famiglia, ad esempio 'isalpha()', 'toupper()' e così via. – caf

2

È perfettamente legittimo fare il cast. Credo che le variabili C siano firmate di default ma il cast lo rende utilizzabile.

+6

In realtà, se un 'char' è firmato o meno è definito dall'implementazione. – Artelius

3

Se si desidera utilizzare ispunct, non c'è modo di aggirarlo.

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

Questo è ciò che ha causato l'insuccesso e quindi il cast è appropriato.

+0

ho scoperto che asseriva pure, ecco perché ha sollevato una bandiera rossa nel mio processo di revisione. Non riesco a capire perché è stato fatto all'interno di crtdbg.h –

Problemi correlati