isalpha() dando una afirmación

4 minutos de lectura

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

ingrese 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 el ASCII de 8 bits no tiene este carácter.

Entonces, ¿cómo manejo esos caracteres que no son 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.

  • Tenga en cuenta que '£' no es un carácter ASCII. Estás mezclando contextos: el resultado puede ser sorprendente.

    – pmg

    14 de julio de 2011 a las 13:29

avatar de usuario
pmg

Es posible que desee convertir el valor enviado a isalpha (y las demás funciones declaradas en <ctype.h>) para unsigned char

isalpha((unsigned char)value)

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


Editado para agregar una explicación.

De acuerdo a el estandarel énfasis es mío

7.4

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

el elenco a unsigned char asegura llamar isalpha() no invoca un comportamiento indefinido.

  • Gracias. carácter c; c=’£’; isalpha((caracter sin signo)(c)); funciona. Sin aserción e isalpha ahora devuelve ‘£’ como NO alfabético.

    – media áurea

    14 de julio de 2011 a las 13:31

  • @Alnitak: jejeje Realmente no expliqué nada … publicación editada

    – pmg

    14 de julio de 2011 a las 14:49

avatar de usuario
Alnitak

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

int isalpha(int c);

Pasar un carácter con signo de 8 bits hará que el valor se convierta en un número entero negativo, lo que resultará en un desplazamiento negativo ilegal en las matrices internas que normalmente utilizan isxxxx().

Sin embargo, debe asegurarse de que su char es tratado como unsigned al lanzar – no puedes simplemente lanzarlo directamente a un intporque si es un carácter de 8 bits, el resultado int seguiría siendo negativo.

La forma típica de garantizar que esto funcione es lanzarlo a un unsigned chary luego confíe en la conversión de tipo implícita para convertir eso en un int.

p.ej

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

  • No lo creo. Incluso cuando lo intenté – int c; c=’£’; y lo pasó a isalpha(c), afirma.

    – media áurea

    14 de julio de 2011 a las 13:24


  • @goldenmean si sus caracteres predeterminados están firmados, seguirán pasando un número entero negativo. que pasa si lo intentas int c = (unsigned char)'£' ?

    – Alnitak

    14 de julio de 2011 a las 13:28


  • Como pmg respondió anteriormente, char c; c=’£’; isalpha((caracter sin signo)(c)); funciona. Sin aserción e isalpha ahora devuelve ‘£’ como NO alfabético.

    – media áurea

    14/07/2011 a las 13:30

  • @goldenmean sí, eso es exactamente lo que estaba diciendo.

    – Alnitak

    14 de julio de 2011 a las 13:34

  • Gracias. +1 por explicación

    – media áurea

    14 de julio de 2011 a las 13:42

Puede estar compilando 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

  • OK, gracias. Ahora se usa if(iswalpha(c)), no afirma pero ahora pasa ‘£’ como carácter alfabético, cuando solo quiero letras ([a..z]) para deducirse como caracteres alfabéticos.

    – media áurea

    14 de julio de 2011 a las 13:21


  • @Anders: ahora, a menos que goldenmean cambie su carácter a wchar_t, está mezclando char y Unicode, lo que seguramente no es correcto.

    – AAT

    14 de julio de 2011 a las 13:44

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad