Этот символ должен быть без знака? - PullRequest
5 голосов
/ 27 октября 2009

Я нашел какой-то запутанный код во время проверки кода и немного озадачен. Делая некоторые исследования, я обнаружил эту ситуацию. Я написал этот пример кода, чтобы выделить проблему

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

Итак, программист, который исправлял ошибки, сделал следующее:

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

Мой вопрос: можно ли сделать char без знака? В идеале, я бы не использовал char, но использовал бы кодировку Unicode, чтобы избежать подобных проблем, но программное обеспечение очень старое и в ближайшее время не будет обновлено.

Я использую Visual Studio 2008. ispunct() можно найти в ctype.h.

Ответы [ 3 ]

7 голосов
/ 27 октября 2009

В этом случае приведение правильное. От man ispunct:

Функция ispunct() проверяет любой печатный символ, кроме пробела (' ') или символ, для которого isalnum(3) равно true. Значение аргумент должен быть представлен в виде unsigned char или значения EOF.

3 голосов
/ 27 октября 2009

Если вы хотите использовать ispunct, то нет никакого способа обойти это.

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

Это то, что заставило утверждение потерпеть неудачу, и, следовательно, приведение было уместным.

2 голосов
/ 27 октября 2009

Совершенно законно делать актерский состав. Я верю, что переменные C подписаны по умолчанию, но приведение делает его пригодным для использования.

...