Вопрос

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

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 подписаны по умолчанию, но приведение делает его пригодным для использования.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top