2010-03-25 11 views
5

string temp es igual a "ZERO: \ t.WORD \ t1" de mi depurador. (La primera línea de mi archivo)isalpha (<mychar>) == true se evalúa como falso?

string temp = RemoveWhiteSpace(data); 
int i = 0; 
if (temp.length() > 0 && isalpha(temp[0])) 
    cout << "without true worked" << endl; 
if (temp.length() > 0 && isalpha(temp[0]) == true) 
    cout << "with true worked" << endl; 

Este es mi código para comprobar si el primer carácter de la temperatura es un a-z, A-Z. La primera instrucción if se evaluará como verdadera y la 2da como falsa. ¡¿¡¿¡¿POR QUÉ?!?!?! He intentado esto incluso sin la "temp.length()> 0 & &" y todavía evalúa falso. Simplemente odia el "== verdadero". Lo único que puedo pensar es que isalpha() devuelve! = 0 y verdadero == 1. Entonces, podrías obtener isalpha() == 2! = 1. Pero, no tengo idea si C++ es eso ... extraño.

Por cierto, no necesito saber que el "== verdadero" es lógicamente inútil. Lo sé.

producción fue

without true worked 

bloque de código compilado con el uso de GNU GCC en Ubuntu 9.10 (si esto importa lo hay)

+1

has necesitado 'tribunal << isalpha (temp [0]) << endl;'? –

+0

"No tengo idea si C++ es así de ... raro". Consultar un manual de referencia le daría una idea. cplusplus.com dice: "Un valor diferente de cero (es decir, 'verdadero') si de hecho * c * es una letra alfabética". Por eso no debe usar cplusplus.com: 'true' en C++ no significa lo mismo que" verdadero "en la descripción en el estándar C de donde copiaron. opengroup.org dice: "La función isalpha() devolverá un valor distinto de cero si c es un carácter alfabético", que es bastante mejor. –

+0

Además, tenga cuidado con la confusión entre esta función isalpha de '' o '', y la plantilla de función 'std :: isalpha' en' '. Este último devuelve 'bool', por lo que si llamaras a eso entonces tu código funcionaría. –

Respuesta

9

Las funciones is * solo garantizan devolver un valor distinto de cero si es verdadero, NO necesariamente 1. Una implementación típica está basada en tablas, con una entrada en la tabla para cada valor de carácter y un conjunto de bits definiendo qué bit significa qué. La función es * justo y la máscara de bits derecha con el valor de la tabla, y el retorno de eso, que sólo será el valor 1 para cualquier tipo resulta haber sido dada la posición de bit 0.

Ej:

#define __digit 1 
#define __lower 2 
#define __upper 4 
extern int __type_table[]; 

int isdigit(int c) { 
    return __type_table[c+1] & __digit; 
} 

int isalpha(int c) { 
    return __type_table[c+1] & (__lower | __upper); 
} 

int islower(int c) { 
    return __type_table[c+1] & __lower; 
} 

int isupper(int c) { 
    return __type_table[c+1] & __upper; 
} 

Donde __type_table se define como algo como int __type_table[UINT_MAX+1]; y se inicializaría (por ejemplo) __type_table['0'+1] == __digit y __type_table['A'+1] == __upper.

En caso de que le importe, la parte '+1' debe dejar un lugar al comienzo de la tabla para EOF (que típicamente se define como -1).

+0

Y LA GENTE SE PREGUNTA POR QUÉ ME GUSTA C# ...../NERDRAGE Gracias :) – Buttink

+0

@Buttink: ahora que lo mencionas, eso parece extraño ... :-) –

+7

@Buttink: gusto C# es lo que te metió en este lío. Si no fuera por C#, estarías contento de usar un entero en un condicional, que funciona, en lugar de compararlo un único valor de "verdad", que no funciona porque las funciones C no fueron diseñadas para que usted haga eso. Está bien preferir C#, pero no está bien pretender que estás escribiendo C# cuando estás realmente escribiendo C++ ;-) –

2

isalpha no devuelve true, que devuelve un valor no nulo. Esto es bastante común que las API diseñada para C.

Tenga en cuenta que en la expresión isalpha(ch) == true, la subexpresión true es ascendido a escribir int con valor 1.

0

Bueno, la documentación sugiere que devuelve cero o no cero, no necesariamente solo falso o verdadero. Así que será mejor que compruebes (isalpha (temp [0])! = 0).

+0

O '!! isalpha (temp [0])'. –

+3

@mmyers: ¡O 'isalpha (temp [0])'! – UncleBens

+1

@UncleBens: * Silencio, matarás mi aire de superioridad. * –

0

No isalpha(ch) == true, pero !!isalpha(ch) == true

+3

Si va a comparar un valor booleano en verdadero (produciendo así otro valor booleano) ¿está seguro de que una vez es suficiente? Tal vez realmente debería ser '(!! isalpha (ch) == true) == true', o tal vez incluso' (((((! Isalpha (ch) == true) == true) == true) = = true) == true '? Oye mira, he inventado Lisp! :-) –

+3

¡Cualquier expresión con doble! las señales necesitan morir. No es ideomático, es feo, y es casi seguro que no es lo que querías hacer de todos modos. -1. –

+0

@Jerry: Creo que el verdadero conocedor de las expresiones booleanas comienza con '(!! isalpha (ch) == (!! true == !! true))', y lo toma desde allí cuando le apetezca. –

Cuestiones relacionadas