PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : String auf Zahlen prüfen - C/C++


Gast
2003-09-26, 17:37:17
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.

Xmas
2003-09-27, 03:14:57
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.

Xmas
2003-09-27, 20:17:10
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