isalpha () dando una afirmación

Tengo un código C en el que estoy usando la función de biblioteca estándar isalpha () en ctype.h, Esto está en Visual Studio 2010-Windows. En el siguiente código, si char c es ‘£’, la llamada isalpha devuelve una aserción como se muestra en la instantánea a continuación:

introduzca la descripción de la imagen aquí

char c='£'; if(isalpha(c)) { printf ("character %c is alphabetic\n",c); } else { printf ("character %c is NOT alphabetic\n",c); } 

Puedo ver que esto podría deberse a que 8 bit ASCII no tiene este carácter.

Entonces, ¿cómo manejo esos caracteres no ASCII fuera de la tabla ASCII?

Lo que quiero hacer es si se encuentra algún carácter no alfabético (incluso si incluye dicho carácter que no está en la tabla ASCII de 8 bits) quiero poder ignorarlo.

Es posible que desee convertir el valor enviado a isalpha (y las otras funciones declaradas en ) a caracteres unsigned char

 isalpha((unsigned char)value) 

Es una de las (no tan) pocas ocasiones en que un reparto es apropiado en C.


Editado para añadir una explicación.

Según la norma , el énfasis es mío.

7.4

1 El encabezado declara varias funciones útiles para clasificar y mapear caracteres. En todos los casos, el argumento es un int , cuyo valor será representable como un unsigned char o será igual al valor de la macro EOF . Si el argumento tiene algún otro valor, el comportamiento no está definido.

La isalpha() a caracteres unsigned char garantiza que la llamada isalpha() no invoque un comportamiento indefinido.

Debes pasar un int a isalpha() , no un char . Tenga en cuenta el prototipo estándar para esta función:

 int isalpha(int c); 

Al pasar un carácter con signo de 8 bits, el valor se convertirá en un entero negativo, lo que dará como resultado un desplazamiento negativo no válido en las matrices internas que normalmente utiliza isxxxx() .

Sin embargo, debe asegurarse de que su char sea ​​tratado como unsigned cuando se lance, no puede simplemente convertirlo directamente en un int , porque si es un carácter de 8 bits, el int resultante aún sería negativo.

La forma típica de garantizar que esto funcione es convertirlo en un unsigned char y luego confiar en la conversión de tipos implícita para convertirlo en un int .

p.ej

 char c = '£'; int a = isalpha((unsigned char) c); 

Puede estar comstackndo usando wchar (UNICODE) como tipo de carácter, en ese caso el método isalpha a usar es iswalpha

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

Intereting Posts