Archiv verlassen und diese Seite im Standarddesign anzeigen : String auf Zahlen prüfen - C/C++
Hallo,
ich bin Anfänger und brauch eigentlich nur eine kleine Hilfe. Ich brauch eine Funktion die mir true oder false zurückliefert, je nach dem ob eine Zeichenkette, die ich der Funktion übergebe, nur Zahlen enthält oder nicht. Sollte sich ein anderes Zeichen, außer den Ziffern von 0 bis 9 enthalten sein, so soll der Rückgabewert false sein.
Vielleicht könntet ihr mir die Funktion posten :)
ethrandil
2003-09-26, 17:46:07
Algo:
für jeden Buchstaben
gibt false zurück, wenn er keine ziffer ist
gib true zurück
ist das so schwer? Meine c++-kentnisse sind arg begrenzt (und ich hab nur ne dunkle ahnung, dass strings char-arrays sind ...) aber der code müsste etwa so aussehen:
for(int c = 0; str[c] != endstring; ++c)
if(str[c] < '0' || str[c] > '9')
return false;
return true;
so?
Elemental
2003-09-26, 22:21:46
kleiner Schuss ins blaue:
for(int nIndex=0; nIndex<(sizeof(strMyString)/sizeof(char)); nIndex++ )
{
if( (strMyString[nIndex]>'9') || (strMyString[nIndex]<'0') ) //gibts keine andere Möglichkeit dafür? Ne IsNumeric() methode oder sowas?
{
return false
}
return true;
}
Gruss
Bernd
edit: Was macht der blöde Smilie da in meinem Code?
Brillus
2003-09-27, 01:34:10
Elemantal sicher das das so klappt ich würde nähmlich sagen das die rturns in der schleife sie Prozedur beenden bevor sie fertig ist.
Original geschrieben von Brillus
Elemantal sicher das das so klappt ich würde nähmlich sagen das die rturns in der schleife sie Prozedur beenden bevor sie fertig ist.
Na genau das ist doch der Zweck, die Funktion vorzeitig zu verlassen. Schließlich muss man nicht stets bis zum Ende prüfen, sondern bei der ersten nicht-Ziffer abbrechen.
ethrandil
2003-09-27, 09:56:01
Original geschrieben von Xmas
Na genau das ist doch der Zweck, die Funktion vorzeitig zu verlassen. Schließlich muss man nicht stets bis zum Ende prüfen, sondern bei der ersten nicht-Ziffer abbrechen.
Ja, das erste !
Das andere sollte außerhalb des for-bodys sein!
statt
for(int nIndex=0; nIndex<sizeof(strMyString)/sizeof(char)); nIndex++ )
{
if( (strMyString[nIndex]>'9') || (strMyString[nIndex]<'0') ) //gibts keine andere Möglichkeit dafür? Ne IsNumeric() methode oder sowas?
{
return false
}
return true;
}
so:
for(int nIndex=0; nIndex<sizeof(strMyString)/sizeof(char)); nIndex++ )
{
if( (strMyString[nIndex]>'9') || (strMyString[nIndex]<'0') ) //gibts keine andere Möglichkeit dafür? Ne IsNumeric() methode oder sowas?
{
return false;
}
}
return true;
btw: Wird so nicht jedesmal sizeof(strMyString)/sizeof(char) berechnet, oder wird das wegoptimiert?
Tom Servo
2003-09-27, 13:12:27
Original geschrieben von ethrandil
//gibts keine andere Möglichkeit dafür? Ne IsNumeric()
[/CODE]
btw: Wird so nicht jedesmal sizeof(strMyString)/sizeof(char) berechnet, oder wird das wegoptimiert?
Im Header cctype gibts std::isdigit()
sizeof wird vom Compiler berechnet, braucht also zur Laufzeit keine Rechenzeit. Bei der Division hängts vom Compiler ab, würde ich sagen. Also mal im Assembler output nachsehen.
sizeof wird hier aber evtl. nicht richtig benutzt. strlen() wäre richtig. Aber besser war m.E. deine erste Idee mit "endstring," was bei Null-terminierten Zeichenketten eben '\0' ist.
Also sowas wie:
#include <cctype>
bool f(const char *s) {
if (s[0] == '\0')
return false; // empty string
for (int i=0; s[i] != '\0'; ++i)
if (!std::isdigit(s[i]))
return false; // non-digit
return true; // digits only
}
Möchte jetzt aber nicht sagen, man sollte das wirklich genauso machen. Vielleicht hat er auch std:string mit Zeichenketten gemeint. Am besten wenn nochmal genau gesagt wird, wofür dieser Code überhaupt gebraucht wird.
Original geschrieben von ethrandil
Ja, das erste !
Das andere sollte außerhalb des for-bodys sein!
btw: Wird so nicht jedesmal sizeof(strMyString)/sizeof(char) berechnet, oder wird das wegoptimiert?
Stymmt natürlich, ich hatte die Klammern irgendwie anders gesehen.
Der Ausdruck wird wegoptimiert wie eigentlich alle Ausdrücke die nur aus Konstanten bestehen.
widerstand
2003-09-30, 20:39:39
suche im Internet nach atoi(). http://www.cplusplus.com/ref/cstdlib/atoi.html
Außerdem gibt es auch in C++ eine Stringklasse. Mal angucken.
Wegen Ascii und Unicode:
http://www.metagraphics.com/index.htm?page=pubs/mgct_language-portable-code.htm
vBulletin®, Copyright ©2000-2025, Jelsoft Enterprises Ltd.