isalpha () дает утверждение - PullRequest
8 голосов
/ 14 июля 2011

У меня есть код C, в котором я использую стандартную библиотечную функцию isalpha () в ctype.h, это на Visual Studio 2010-Windows. В приведенном ниже коде, если char c равен '£', вызов isalpha возвращает утверждение, как показано на снимке ниже:

enter image description here

char c='£';

if(isalpha(c))
{
    printf ("character %c is alphabetic\n",c);

}
else
{
    printf ("character %c is NOT alphabetic\n",c);
}

Я вижу, что это может быть потому, что 8-битный ASCII не имеет этого символа.

Так как мне обрабатывать такие не-ASCII символы вне таблицы ASCII?

Что я хочу сделать, так это найти любой не алфавитный символ (даже если он содержит такой символ, которого нет в 8-битной таблице ASCII), и я хочу, чтобы его можно было игнорировать.

Ответы [ 3 ]

10 голосов
/ 14 июля 2011

Возможно, вы захотите привести значение, отправленное к isalpha (и другим функциям, объявленным в <ctype.h>), к unsigned char

isalpha((unsigned char)value)

Это один из (не очень) случаев, когдаприведение в C уместно.


Отредактировано для добавления объяснения.

Согласно стандарту , акцент мой

7.4

1 Заголовок <ctype.h> объявляет несколько функций, полезных для классификации и сопоставления символов.Во всех случаях аргументом является int, значение которого должно быть представлено как unsigned char или должно равняться значению макроса EOF. Если аргумент имеет любое другое значение, поведение не определено.

Приведение к unsigned char гарантирует, что вызов isalpha() не вызовет неопределенное поведение.

8 голосов
/ 14 июля 2011

Вы должны передать int isalpha(), а не char.Обратите внимание на стандартный прототип для этой функции:

int isalpha(int c);

Передача 8-разрядного знака со знаком приведет к преобразованию значения в отрицательное целое число, что приведет к недопустимому отрицательному смещению во внутренние массивы, обычно используемые isxxxx().

Однако вы должны убедиться, что ваш char обрабатывается как unsigned при приведении - вы не можете просто привести его непосредственно к int, потому что если это 8-битный символ,результирующий int все равно будет отрицательным.

Типичный способ убедиться, что эта работа приведена к unsigned char, а затем полагаться на неявное преобразование типов для преобразования этого в int.

например

char c = '£';
int a = isalpha((unsigned char) c);
2 голосов
/ 14 июля 2011

Вы можете компилировать, используя wchar (UNICODE) в качестве типа символа, в этом случае используется метод isalpha iswalpha

http://msdn.microsoft.com/en-us/library/xt82b8z8.aspx

...