2010-03-25 11 views
5

Zeichenfolge Temp ist gleich "ZERO: \ t.WORD \ t1" von meinem Debugger. (Die erste Zeile der Datei my)isalpha (<mychar>) == true ergibt false?

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; 

Dies ist mein Code zu überprüfen, ob erste Zeichen Temp ist ein a-z, A-Z. Die erste if-Anweisung wird als wahr und die zweite als false ausgewertet. WARUM?!?!?! Ich habe das auch ohne die "temp.length()> 0 & &" versucht und es bewertet immer noch falsch. Es hasst nur das "== wahr". Das einzige, was mir einfällt, ist, dass isalpha() zurückgibt! = 0 und true == 1. Dann könntest du isalpha() == 2! = 1 bekommen. Aber ich habe keine Ahnung, ob C++ das ist ... seltsam.

BTW, ich brauche nicht zu wissen, dass die "== wahr" logisch sinnlos ist. Ich kenne.

Ausgang war

without true worked 

mit Codeblock Zusammengestellt mit GNU GCC auf Ubuntu 9.10 (wenn dies zählt jede)

+1

Haben Sie 'cout << isalpha (Temp [0]) << endl versucht,'? –

+0

"Ich habe keine Ahnung, ob C++ das ist ... komisch". Ein Referenzhandbuch zu konsultieren würde Ihnen eine Idee geben. cplusplus.com sagt: "Ein Wert ungleich Null (d. h." wahr "), wenn tatsächlich * c * ein alphabetischer Buchstabe ist". Aus diesem Grund sollten Sie cplusplus.com nicht verwenden: "wahr" in C++ bedeutet nicht dasselbe wie "wahr" in der Beschreibung des C-Standards, von dem sie kopiert wurden. opengroup.org sagt: "Die isalpha() - Funktion soll nicht null zurückgeben, wenn c ein alphabetisches Zeichen ist", was ziemlich besser ist. –

+0

Beachten Sie auch die Verwechslung dieser isalpha-Funktion von '' oder '' und die Funktionsschablone 'std :: isalpha' in' '. Letzteres gibt 'bool' zurück. Wenn Sie also anrufen würden, würde Ihr Code funktionieren. –

Antwort

9

Die is * -Funktionen geben nur dann einen Wert ungleich null zurück, wenn sie wahr sind, NICHT unbedingt eine 1. Eine typische Implementierung ist tabellenbasiert, mit einem Eintrag in der Tabelle für jeden Zeichenwert und einem Satz Bits welches Bit bedeutet was. Das ist * Funktion wird nur und die rechte bitmask mit dem Tabellenwert, und des Rück, die nur der Wert 1 für je nachdem, welche Art sein wird, geschieht mit Bit-Position 0

Eg gegeben wurde:

#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; 
} 

Wobei __type_table als etwas wie int __type_table[UINT_MAX+1]; definiert ist und so initialisiert werden würde (zum Beispiel) __type_table['0'+1] == __digit und __type_table['A'+1] == __upper.

Für den Fall, dass Sie sich kümmern, ist der '+1' -Teil, eine Stelle am Anfang der Tabelle für EOF (die normalerweise als -1 definiert ist) zu belassen.

+0

AND PEOPLE WONDER WARUM ICH C# ...../NERDRAGE Danke :) – Buttink

+0

@Buttink: jetzt, dass Sie es erwähnen, scheint es Odd ... :-) –

+7

@Buttink: Mögen C# ist, was Sie in dieses Durcheinander gebracht hat - wenn es nicht für C# wäre, würden Sie glücklich sein, nur eine Ganzzahl in einer Bedingung zu verwenden, die funktioniert, anstatt sie zu vergleichen ein einzelner "Wahrheitswert", der nicht deshalb ist, weil die C-Funktionen nicht dafür ausgelegt waren. Es ist in Ordnung, C# zu bevorzugen, aber es ist nicht in Ordnung, C# zu schreiben, wenn Sie wirklich C++ schreiben ;-) –

2

isalpha nicht true zurückkehrt, gibt er nicht Null ist. Dies ist durchaus üblich, API für C ausgelegt

Beachten Sie, dass in dem Ausdruck isalpha(ch) == true, die subexpression true gefördert int mit dem Wert 1.

0

Nun zu geben, schlägt die Dokumentation, dass es entweder Null oder nicht zurückgibt Null, nicht unbedingt nur falsch oder wahr. Du solltest besser nachsehen (isalpha (temp [0])! = 0).

+0

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

+3

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

+1

@UncleBens: * Pssst, du wirst meine Luft der Überlegenheit töten. * –

0

Nicht isalpha(ch) == true, aber !!isalpha(ch) == true

+3

Wenn Sie einen booleschen Wert mit true vergleichen wollen (was einen anderen booleschen Wert ergibt), sind Sie sicher, dass einmal genug ist? Vielleicht sollte es wirklich "(!! isalpha (ch) == wahr) == wahr" oder vielleicht sogar "((((!! isalpha (ch) == wahr) == wahr) == wahr) = = true) == true'? Hey schau, ich habe Lisp erfunden! :-) –

+3

Jeder Ausdruck mit Doppel! Zeichen müssen sterben. Es ist nicht ideologisch, es ist hässlich, und es ist fast sicher nicht das, was du sowieso machen wolltest. -1. –

+0

@Jerry: Ich denke, der wahre Kenner boolescher Ausdrücke beginnt mit '(!! isalpha (ch) == (!! true == !! true))' und nimmt es von dort, wenn die Stimmung stimmt. –