Char in Integer
-
Machs wir LordJaxom sagt
Char* ist ja eine Reihe von chars und du vergleichst oben char mit int. Weil beides numerische Integer sind, besteht da kein Problem vom Compiler her
Mit '5' bekommst du aber den ASC II Code und den möchtest du schließlich vergleichen

-
Hehe oka, sowas hatte ich mir schon gedacht.
Danke
-
LordJaxom schrieb:
Du brauchst nicht casten, um den Zeichencode zu vergleichen. Und der von '3' ist nunmal größer als 5

Was Du machen könntest, ist gegen den Zeichencode von '5' zu vergleichen, dann musst Du aber auch ne Grenze (nach oben) setzen, denn sonst passt der Vergleich auch auf jede Nicht-Ziffer deren Zeichencode größer als '5' ist.
if (x[3] > '5' && x[3] <= '9') // oder if (isdigit(x[3]) && x[3] > '5')@piXelshooter:
Dein Code vergleicht aber einen Zeichencode gegen einen Zeiger...
besteht etwa ein unterschied in der bedeutung von "X" und 'X'? wieder was gelernt 
-
Natürlich besteht da ein Unterschied...
'x' ist einfach ein char mit dem Wert x
"x" ist dagegen ein char-Array, dessen Adresse von dem Ausdruck zurückgegeben wird. Im Speicher an der Stelle 0xABC ist dann halt
x\0und der Ausdruck "x" hat dann den Wert 0xABC.
-
Hi, bin neu vielleicht hab ich aber trotzdem ne Lösung?!
man kann mit follgenden Anweisungen Variablen Typen in einen anderen zwingen:
int x2 = (int) x[3]; // durch den Syntax (int) wird aus char x[3] ein Integer!Vielleicht klappt das auch mit chars?!

-
das ist genau das angesprochene "casting".
beim casting von char(*) nach int wird aber zum Beispiel der char wert BEL (ASCII 8 soviel ich weiß geht eig auch nur um die nummer
) zu int 8 konvertiert. daher: ziffern werden nicht in ihr werte repräsentativ konvertiert, sondern in ihren zeichencode.
-
Kann man trotzdem einen char Array in einen Integer zwingen?

Kann man denn follgenden Code schreiben:
char x[] = "0123"; if (x[3] >= "2") /* oder */ if (x[3] > '2')Abfragen mit < > bei Character oder Strings?
-
das 2. geht ... warum nicht ... wird zwar die ziffer die das Zeichen repräsentiert als Ausgangspunkt genommen ... aber es geht.
-
LukasBanana schrieb:
Kann man trotzdem einen char Array in einen Integer zwingen?

Kann man denn follgenden Code schreiben:
char x[] = "0123"; if (x[3] >= "2") /* oder */ if (x[3] > '2')Abfragen mit < > bei Character oder Strings?
Also wenn ich das richtig sehe, dann fehlt es hier doch ein wenig an Grundlegendem. Also machen wir ausnahmsweise mal ein paar Grundlagen.
1. Alles was Du in doppelte Anführungszeichen setzt, ist letztlich eine Ansammlung, oder besser gesagt eine "Reihe" von Zeichen, auch wenn die Menge dieser Zeichen gleich eins ist (in Wahrheit hängt der Compiler intern noch eine 0 (null) dran, und markiert damit das Ende dieser "Ansammlung"). Das englische Wort für sowas ist "Array" ( = Reihe). In C nennt man sowas auch einen "ASCII-Z string", was nichts mit der Klasse std::string zu aus C++ tun hat. Das 'Z' steht dabei für 'Zero', also null, weil eben der Compiler intern noch eine null dranhängt.
Wenn Du ein einzelnes Zeichen verwenden willst, dann nehme einfache Anführungszeichen.
2. wie (D)evil schon gesagt hat, geht daher die zweite Variante, die erste ist aus obengenannten Gründen schlicht grausig.
3. An den Thread-Eröffner: Als ich vor 20 Jahren meine ersten C-Erfahrungen sammelte, hatte ich das "merkwürdige" Problem, dass die Ziffer '1', die ich über einen getchar() ans Programm übergab, im Programm einfach nicht den Wert 1 haben wollte, es kam immer der Wert 49 an. Es gab kein Internet, und ich kannte niemanden, der 'C' programmieren konnte. Ich brauchte Tage, um die Lösung zu finden. Dein Problem hier ist genau das gleiche, hier ist die Lösung. Sie ist zwar einfach, aber wenn man es nicht weiss, hat man einfach keine Chance:
Du möchtest die Ziffer '3' mit dem Wert 5 vergleichen. Beachte meine Schreibweise: die '3' steht in Anführungszeichen, die 5 nicht.
Der Hintergrund: jedes Zeichen wird (innen) in einem Computer als Zahl dargestellt. Ein grosses 'A' beispielsweise wird als Zahl 65 gespeichert, weil Computer eben nur Zahlen kennen, und keine Buchstaben, Also hat man weltweit einen Code vereinbart, der genau festlegt, dass ein grosses 'A' in einem Computertext als numerischer Wert 65 gespeichert wird. Das ist einfach so und damit basta. Dieser Code nennt sich 'ASCII'-Code. (Es gibt auch Computer, die verwenden einen andern Code - EBCDIC - , aber wir reden hier von 'normalen' PC).
Genau wie für das Zeichen 'A' gibt es auch für das Zeichen '3' eine solche Festlegung. Dieses Zeichen steht in der ASCII-Tablle an der 52ten Stelle, und wird deshalb als der numerische Wert 51 abgespeichert. Jaja, ist eins zuwenig, aber die Tabelle beginnt halt mit mit Null und nicht mit eins.
Und so hat jedes Zeichen eine eigene, genau festgelegte Stelle in der genannten Tabelle, und diese entspricht (beginnend mit null) eben dem numerischen Wert, mit dem dieses Zeichen in einem Rechner abgespeichert wird. Schau mal hier:
http://de.wikipedia.org/wiki/ASCII-Tabelle
Du musst dabei beachten, dass ein 'Zeichen' nicht gleich einem 'Wert' ist. Die '3' ist eben nur eine grafische Darstellung, ein Zeichen eben. Genau wie das 'A'. Wenn man das mal kapiert hat, ist es ganz einfach.
Abschliessend zur Konvertierung.
Es ist in C/C++ erlaubt, auch mit 'Zeichen' mathematische Operationen auszuführen, was ja eigentlich auch klar ist, denn weiter oben habe ich ja bereits gesagt, dass ein 'A' im Grunde das gleiche ist, wie der Wert 65. Wenn ich zu einem 'A' eine 1 hinzu zähle (eine 1 wohlgemerkt, nicht etwa eine '1' !!!), dann habe ich den Wert 66, und das entspricht laut ASCII-Vereinbarung dem Buchstaben 'B'.
Das gilt auch für die '1', die '2' usw.
Nun kommt der einfache Trick:
Wenn Du in der Tabelle nachsiehst, wirst Du feststellen, das das Zeichen '0' dem numerischen Wert 48 entspricht. Das zeichen '3' entspricht dem Wert 51. Wenn du nun das numerische Aquivalent eines der Zeichen '0' ... '9' haben willst, dann kannst Du das ganz einfach so machen:
char zeichen = '7'; int nummer = zeichen - '0';Was passiert da?
1. 'zeichen' wird '7', das entspricht dem Wert 55.
2. nummer wird '7' - 0', das entspricht 55 - 48Und das ist gleich 7
Wenn Du also ein Zeichen von '0' bis '9' hast, und möchtest das numerische Äquivalent erhalten, dann kannst Du von diesem Zeichen einfach '0' abziehen. Das wars.
Dein Vergleich müsste also konkret so aussehen:
if ( (x[3] - '0') > 5) std :: cout << "FAALSCH";oder aber
if (x[3] > (5 + '0')) std :: cout << "FAALSCH";oder
if (x[3] > '5') std :: cout << "FAALSCH";Probier's einfach mal aus: die Meldung wird nicht mehr ausgegeben.
An alle anderen: ich hab's deshalb so ausführlich gemacht, weil ich genau weiss, wie das ist, wenn's einem niemand erklärt. Hab's selber erlebt, ist scheìss frustrierend.
Grüsse
emax
-
Ich danke für die Grundlagen von emax, von denen mir allerdings bereits die meisten bekannt waren!
Allerdings weiß ich noch nicht genau was C++ alles zulässt und was nicht!
Also ich weiß eben noch nicht genau was C++ alles zulässt, was aber eigentlich unanständig ist!
Aber danke für eure Beispiele!