Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
17.11.2001, 23:07
Creeper



Hi, weiss hier jemand, wie ihc in C++ einen String überprüfe, ob er nur Zahlen enthält oder auch Buchstaben, oder muss ich da jeden char ainzeln überprüfen ??

--

Head Coder:Sudden-Impact

Listen to CKY you fuCKYrs http://www.ckymusic.com

zum Seitenanfang zum Seitenende Profil || Suche
001
18.11.2001, 07:53
Tron



Quellcode:
.bool IsNumber(const char* pString)
.{
.  for(; *pString == ' '; ++pString);  // fuehrende leerzeichen ignorieren
.  for(; (*pString >= '0') && (*pString <= '9'); ++pString);  // nur ziffern zulassen
.  for(; *pString == ' '; ++pString);    // nachfolgende leerzeichen ignorieren
.  return !*pString;  //  wenn string zu ende ist, true zurueckgeben
.}

nicht getestet, muesste aber funktionieren

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett


Dieser Beitrag wurde am 18.11.2001 um 08:05 von Tron bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
002
18.11.2001, 13:00
Mazze



Gibt auch ne Funktion!
Whitespace testen: int isspace(int)
Zahl: int isdigit(int);
Buchstabe: int isalpha(int);
Da gibts noch mehr!
Zu finden in <ctype.h> und <cctype>

--

BattleTech-MOD:
http://bthl.unitedgaming.net/

zum Seitenanfang zum Seitenende Profil || Suche
003
18.11.2001, 15:00
Creeper



ok, danke

--

Head Coder:Sudden-Impact

Listen to CKY you fuCKYrs http://www.ckymusic.com

zum Seitenanfang zum Seitenende Profil || Suche
004
19.11.2001, 01:20
Kriz



Rofl, Tron ist ja der Verfechter der for-Schleifen =) Ich meine, das kann man auch so schreiben:
Quellcode:bool isNumber(const char* string)
{
....while(*string++==' ');
....while(*string>='0' && *string<='9') ++string;
....while(*string++==' ');
....return !*string;
}

=) Ist afaik schneller als mit for-Schleifen, wobei dieses Konstrukt einen Nachteil hat (_ = Space/Leerzeichen):

string = "_____5345_0675___";

Gelesen werden die vorausgehenden Leerzeichen, dann die Zahlen 5,3,4 und 5 und dann wieder das Leerzeichen. Da aber die Funktion nicht mehr weiterliest (weil 0 kommt = char(48)), ist die Funktion zuende und es wird FALSE zurückgegeben (48 != 0 = TRUE, das negiert ergibt FALSE). Dieses Ergebnis ist aber falsch, da der String im Prinzip (außer den Leerzeichen) ja wirklich nur Zahlen enthält. Intelligenter wäre dieser Code:
Quellcode:bool isNumber(const char* string)
{
....bool val = false;
....while(*string)
....{
........if(*string!=' ' && *string<'0' && *string>'9') val = false;
........else val = true;
........++string;
....}
....return val;
}

Hier geht die Funktion den gesamten String von vorne bis hinten durch und prüft, ob wirklich nur zu ignorierende Leerzeichen und Ziffersymbole vorkommen. Alles andere wird als FALSE zurückgegeben. Da ein String vom Compiler automatisch den Nullterminator angehängt bekommt '\0', bricht die while-Schleife auch beim Erreichen des Stringendes ab, da *string = '\0' den Wert 0 hat und 0 ist false...

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
005
19.11.2001, 07:07
Tron



@Kriz:
ich hab e die for-schleife genommen, um den vergleich und den iterator zu trennen, da ich mir nicht sicher bin, ob das ergebnis von *string++==' ' definiert ist.
z.b. ist die ausgabe von cout << x++ << x; undefiniert (laut www.cprogramming.com -> c-quiz)

ich hab meine funktion absichtlich so geschrieben, dass sie keine getrennten zahlen akzeptiert, da ich angenommmen habe (okok... 1. programmierer-regel: NEVER make assumptions), dass er pruefen will, ob der string eine gueltige Zahl enthaelt.

dein code funzt nicht, da sie, wenn das letzte zeichen eine ziffer oder leerzeichen ist, true zurueckgegeben wird. (ausserdem hast du auch was in der bedingung verdreht, die NIE true ist)

besser waere:
Quellcode:
bool IsNumber(const char* pString)
{
..for(; *pString; ++pString)
....if ((*pString != ' ') && ((*pString < '0') || (*pString > '9'))) return false;
..return true;
}

(so, ich HOFFE das stimmt)

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
006
19.11.2001, 09:48
Creeper



So isses richitg, oder ?

[code]
bool isNumber(const char* string)
{
....bool val = false;
....while(*string)
....{
........if (*string == '\0') break;
........if (*string == ' ' || *string < '0' || *string > '9') val = false;
........else val = true;
........++string;
....}
....return val;
}

--

Head Coder:Sudden-Impact

Listen to CKY you fuCKYrs http://www.ckymusic.com

zum Seitenanfang zum Seitenende Profil || Suche
007
19.11.2001, 11:38
Kriz



Mähhhhh, Denkfehler =) So ist's richtig:
Quellcode:bool isNumber(const char* string)
{
....bool val = false;
....while(*string)
....{
........if(*string!=' ' || (*string<'0' && *string>'9')) val = false;
........else val = true;
........++string;
....}
....return val;
}

Das kann man Dank der DeMorgan'schen Gesetze drehen wie man will:
Quellcode:if(*string!=' ' || (*string<'0' && *string>'9')) val = false;
if(*string!=' ' && (*string<'0' || *string>'9')) val = false;

Beide Abfragen sind identisch =)

PS: cout << x++ << x; ist undefiniert, das stimmt. Wenn man Kontrolle haben will, dann muß man schreiben cout << ++x << x; Das alles ist aber sehr verwunderlich, da bei x++ der ++ Operator Priorität 1 genießt, also als allererstes ausgeführt wird. << dagegen hat nur Priorität 6, müßte also nach erst nach der Inkrementierung ausgeführt werden. Das tut es aber nicht... Noch komischer ist, daß bei ++x das ++ Priorität 2 besitzt, aber nun trotzdem vor << ausgeführt wird... Tja

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)


Dieser Beitrag wurde am 19.11.2001 um 11:47 von Kriz bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
008
19.11.2001, 13:06
Tron



@Kriz:
mähhhhh mähhhhh ... doppeldenkfehler!

Zitat:

Das kann man Dank der DeMorgan'schen Gesetze drehen wie man will:
if(*string!=' ' || (*string<'0' && *string>'9')) val = false;
if(*string!=' ' && (*string<'0' || *string>'9')) val = false;

was immer du da gemacht hast is KEIN DeMorgan gesetz
im uebrigen, was ich auch vorhin (post 005) meinte, kann KEIN zeichen kleiner '0' UND groeßer '9' sein

das DeMorgan Gesetz lautet:
(!a && !b) == !(a || b)
bzw.
(!a || !b) == !(a && b)

ich denke, dass mein code-schnipsel aus post 005 richtig ist (denke, hoffe, galube ich, hab' grad' net genug zeit nochmal drueber nachzudenken)

@Creeper:

Zitat:

bool isNumber(const char* string)
{
....bool val = false;
....while(*string)
....{
........if (*string == '\0') break;
........if (*string == ' ' || *string < '0' || *string > '9') val = false; else val = true;
........++string;
....}
....return val;
}

ich denke, dass das nicht richtig ist:
1. if (*string == '\0') break;
das ist unnoetig, dafuer ist schon die while-schleife selbst da
2. if (*string == ' ' || *string < '0' || *string > '9') val = false; else val = true;
die bedingung ist falsch (denk drueber nach, mit boolscher algebra kann man sich echt das gehirn verknoten)
und ausserdem besteht noch das gleiche problem, das ich auch Kriz gesagt habe (angenommen man korrigiert die bedingung) : wenn das letzte zeichen eine ziffer/leerzeichen ist, gibt die funktion true zurueck (egal was vorher fuer zeichen da waren)

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
009
19.11.2001, 14:37
Kriz



@Tron: Erbsenzähler ;) Für diese Form der Wandlung gibt es tatsächlich kein eigenes Gesetz in der boole'schen Algebra...

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
010
20.11.2001, 22:49
Creeper



ok, ok, ich war inner Schule :rolleyes:

Quellcode:
bool isNumber(const char* string)
{
....bool val = false;
....while(*string)
....{
........if (*string == ' ' || *string < '0' || *string > '9')
........{
............val = false;
............break;
........}
........else val = true;
........++string;
....}
....return val;
}

--

Head Coder:Sudden-Impact

Listen to CKY you fuCKYrs http://www.ckymusic.com

zum Seitenanfang zum Seitenende Profil || Suche
011
20.11.2001, 23:01
Tron



hmmm... die bedingung ist (denke ich) immer noch falsch, ein ' ' (0x20) erzeugt ein falsches ergebnis (' ' < '0')
ich bleibe bei meinem code:
Quellcode:
bool IsNumber(const char* pString)
{
..for(; *pString; ++pString)
....if ((*pString != ' ') && ((*pString < '0') || (*pString > '9'))) return false;
..return true;
}

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
012
21.11.2001, 12:08
Creeper



naja ein leerzeichen isr doch keine zahl :D

--

Head Coder:Sudden-Impact

Listen to CKY you fuCKYrs http://www.ckymusic.com

zum Seitenanfang zum Seitenende Profil || Suche
013
21.11.2001, 15:04
Kriz



Quellcode:bool isNumber(const char* string)
{
....bool val = false;
....while(*string)
....{
........if(*string<'0' || *string>'9') val = false;
........else val = true;
........++string;
....}
....return val;
}
Dann bleibt nur das übrig...

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
014
21.11.2001, 15:58
Tron



@Kriz:
falsch (;
lass mal den string "abcdefghijkl9" durch deine funktion laufen

mein vorschlag:

Quellcode:
bool IsNumber(const char* pString)
{
..for(; (*pString >= '0') && (*pString <= '9'); ++pString); // nur ziffern zulassen
..return !*pString; // wenn string zu ende ist, true zurueckgeben
}

oder etwas anders (weiss nicht was schneller ist, ich vermute ersterer, dan nur 2 statt 3 pruefungen pro schleifendurchlauf) :
[code]
bool IsNumber(const char* pString)
{
..for(; *pString; ++pString)
....if ((*pString < '0') || (*pString > '9')) return false; // keine ziffer? -> false
..return true;
}

und falls doch fuehrende oder nachfolgende leerzeichen erlaubt sind, dann mein code aus post 001

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
015
21.11.2001, 22:17
Creeper



Kriz, vergisst immer das break; :D

--

Head Coder:Sudden-Impact

Listen to CKY you fuCKYrs http://www.ckymusic.com


Dieser Beitrag wurde am 21.11.2001 um 22:17 von Creeper bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
016
22.11.2001, 00:14
Kriz



Nee, ich vergesse immer, daß bei einem OR immer true rauskommt, wenn ein Teilausdruck stimmt. Natürlich muß da AND hin (&&), rofl =)

@Creeper: Das break reißt hier auch nix mehr raus...

@Tron: Erste Version ist schneller, obwohl mir das ehrlich gesagt vollkommen schnuppe wäre, weil das selbst bei einem C64 net aufgefallen wäre, ob der nun 2 oder 3 Prüfungen vornimmt. AND und OR sind atomare Schaltungen und daher so schnell wie der Blitz. Die ALU basiert drauf, also von daher...

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
017
22.11.2001, 06:54
Tron



Zitat:
Kriz postete
Nee, ich vergesse immer, daß bei einem OR immer true rauskommt, wenn ein Teilausdruck stimmt. Natürlich muß da AND hin (&&), rofl =)

Quellcode:
bool isNumber(const char* string)
{
....bool val = false;
....while(*string)
....{
........if(*string<'0' || *string>'9') val = false;
........else val = true;
........++string;
....}
....return val;
}

aehm... ich glaube du hast dich igendwie ziemlich verheddert
wenn man da ein && reinbaut, also ((*string<'0') && (*string>'9')) dann ist diese bedingung IMMER falsch, da kein zeichen kleiner '0' UND groeßer '9' sein kann
genauso wie es keine zahl kleiner 48 und groeßer 57 gibt

ich empfinde die loesung mit dieser return-variablen (val) als umstaendlich, einfacher ist sobald eine nicht-ziffer gefunden ist -> return false

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
018
22.11.2001, 12:53
Creeper



...oder break :P

--

Head Coder:Sudden-Impact

Listen to CKY you fuCKYrs http://www.ckymusic.com

zum Seitenanfang zum Seitenende Profil || Suche
019
22.11.2001, 17:57
Kriz



Quellcode:bool isNumber(const char* string)
{
....bool val = true;
....while(*string)
....{
........if(*string<'0' || *string>'9') val = false;
........++string;
....}
....return val;
}
So, jetzt paßt es aber, hab's nachgetestet...

Und Creeper, vergiß dein break :p

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
020
22.11.2001, 20:10
Tron



@Kriz:
warum net statt 'val = false' direkt 'return false'?
ist das gegen deinen programmier-stil oder hat das nen anderen grund? *neugierig*

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
021
22.11.2001, 23:07
Kriz



ARGHHHHHHHHHHHHHHHHHH

Von mir aus auch mit direktem return false, ist mir doch schnuppe, Leute!!!

=)

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
022
23.11.2001, 00:06
anothergb02



ma ne dumme Frage:
Was macht ++string ? was macht das ++ ?
Ich habe schon zich "Stringproggs" neue Stringroutinen geschrieben, aber das habe ich bis jetzt noch nie gesehen :( naja mal wieder was dazu gelernt :D

--

Being in john Malkovich
.....

zum Seitenanfang zum Seitenende Profil || Suche
023
23.11.2001, 03:16
Kriz



++ ist ein unärer (einzelner) Inkrementierungsoperator. Also wer den net kennt, der kennt weder C, C++ oder Java und dergleichen!

++ gibt es als Präfix und als Postfix:

++a (Präfix)
a++ (Postfix)

a++ inkrementiert a BEVOR a benutzt wird
Quellcode:int a = 5, erg;
erg = a++;
// erg = 5, a = 6

++a benutzt a BEVOR a inkrementiert wird
Quellcode:int a = 5, erg;
erg = ++a;
// erg = 6, a = 6

Benutzt man ++ alleine ohne Zuweisung, dann spielt es keine Rolle, ob man ++a oder a++ schreibt:
Quellcode:for(int i=0; i<100; i++) {...}
hat denselben Effekt wie
Quellcode:for(int i=0; i<100; ++i) {...}

++string ist eine schnelle Zeigeroperation auf die Variable string, da diese vom Datentyp char* ist. Char* ist ein "Zeiger auf char" und definiert in C/C++ die Anfangsadresse des ersten Zeichens eines Strings.

Durch ++string setzt man den Zeiger auf die Adresse des nächsten Zeichens (sofern ein nächstes Zeichen existiert). Der Zeiger "weiß", wieviele Bytes er im RAM weiterspringen muß, um auf die nächste Adresse zeigen zu können. Im Falle von char als 8-Bit Datentyp wäre das genau 1 Byte pro Sprung.
Quellcode:char* string = "abcd";
// string zeigt auf die Adresse des ersten Zeichens = 'a'
++string;
// string springt 1 Byte weiter im RAM und zeigt nun auf 'b'
usw...

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
024
23.11.2001, 12:26
anothergb02



Danke :D ich benutze selber c++, kenne auch das ++ .... , wusste nur nicht, dass man das auch fuer Strings benutzen kann (upsa da habe ich wohl am Anfang vom C++ lernen ne Zeile bei dem Thema uebersehen :( ):D habe das immer anders gecodet -> mit array oder Stringaussortierung ... krass wusste gar nicht, dass das auch so einfach geht jepa

--

Being in john Malkovich
.....

zum Seitenanfang zum Seitenende Profil || Suche