Этот символ должен быть без знака?
-
06-07-2019 - |
Вопрос
Я нашел какой-то запутанный код во время проверки кода и немного озадачен. Делая некоторые исследования, я обнаружил эту ситуацию. Я написал этот пример кода, чтобы осветить проблему
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
.
Решение
В этом случае приведение правильное. Из man ispunct код>
:
Функция
ispunct ()
проверяет любой печатный символ, кроме пробела (''
) или символ, для которогоisalnum (3)
равенtrue
. Значение Аргумент должен быть представлен какunsigned char
или значениемEOF
.
Другие советы
Если вы хотите использовать ispunct
, то нет никакого способа обойти это.
_ASSERTE((unsigned)(c + 1) <= 256);
Вот что заставило утверждение потерпеть неудачу и, следовательно, приведение было уместным.
Совершенно законно исполнять актеры. Я верю, что переменные C подписаны по умолчанию, но приведение делает его пригодным для использования. Р>