Archiv verlassen und diese Seite im Standarddesign anzeigen : Rausfinden ob String ne nummer ist
Hi,
ich will testen, ob ein char* nur aus nummern besteht. isalnum() und isalpha() testen ja nur obs ein Buchstabe ist. Ausserdem testet isalpha(char*) nur den 1. Buchstaben.
Beatkiller
12-03-2005, 07:40
Das würde ich so lösen, das ich den kompletten String durchlaufe (jeder String ist ja normalerweise ein array of char). Dann jeden Buchstaben nach seinem ASCII-Zeichen untersuchen. Das Zeichen sollte größer als 48d und kleiner gleich 57d sein.
Sollte nun einfach sein, einen Algo dafür zu schreiben.
int isNumber(char* string) {
for(int i=0; i<=strlen(str); i++)
{
if(str[i] <= 48 || str[i] => 57) return false;
}
return true;
}
So ungefähr? :)
int isNumber(char* string) {
for(int i=0; i<=strlen(str); i++)
{
if(str[i] <= 48 || str[i] => 57) return false;
}
return true;
}
So ungefähr? :)
Fast
Fehler gesehen?
man isdigit (http://www.hmug.org/man/3/isdigit.html)
Und da dann die Schleife drum bauen.
Fast
Fehler gesehen?
ja true<=>false
Ne, das mit True und False stimmt schon. ;) Aber den Fehler den Pingu meint wird dir auch jeder Compiler melden, insofern isser nicht besonders schlimm. Da ist aber noch n anderer drin, 48 und 57 sind nämlich sehr wohl Nummern. Aber ich denke mit isdigit() wirds auch klappen.
Edit: Ist noch n anderer Fehler drin, solltest du aber selber finden. :)
Ne, das mit True und False stimmt schon. ;) Aber den Fehler den Pingu meint wird dir auch jeder Compiler melden, insofern isser nicht besonders schlimm. Da ist aber noch n anderer drin, 48 und 57 sind nämlich sehr wohl Nummern. Aber ich denke mit isdigit() wirds auch klappen.
Edit: Ist noch n anderer Fehler drin, solltest du aber selber finden. :)
48 und 57 sollen auch nummer sein! aber isDigit() is kürzer, darum hab ichs auch genommen. \0 auch weggetested, dann passt das :)
int
isNumb(char* string)
{
int i = 0;
for (; i<strlen(string); i++)
{
g_print("ASd: %d\n", string[i]);
if(!isdigit(string[i]) || string[i] == 0) return FALSE;
}
return TRUE;
}
Warumg eht eigentlich "return true;" nicht, sondern nur "return TRUE;"? oder geht das nur in C++?
michael.sprick
12-03-2005, 09:46
hi,
warum musst man denn nochmal auf '\0' testen?
strlen(string) liefert doch eh nur die Länge bis zum Stringende (excl. 0) - damit dürfte ein Vorkommen von '\0' innerhalb der Schleife doch schon ausgeschlossen sein, oder?
Michael :)
peschmae
12-03-2005, 10:11
Man könnte natürlich auch das strlen weglassen ;)
MfG Peschmä
huh? ohne das "|| string[i] == 0" ist beim letzten mal immer "ASd: 0", und es wird false zurückgegen.
peschmae
12-03-2005, 13:58
Noch nen Alternativvorschlag:
return ( !(strspn(string, "0123456789") - strlen(string) ) );
strspn gibt zurück wie oft eins von 0123456789 in string vorkommt (vom Anfang an nacheinander), strlen die Zahl zeichen. Das ganze ist 0 wenns nur Ziffern sind also noch ein ! um daraus ein true zu machen.
MfG Peschmä
einfach den string mit strol() konvertieren und errno testen.
-j
locus vivendi
12-03-2005, 14:58
Hier sind zwar schon viele Vorschläge, ich möchte aber dennoch einmal einwerfen das es in C++ eine Funktion gibt, die quasi das gewünschte macht:
bool is_number(char const* p_str)
{
char const* p_ret = std::use_facet<std::ctype<char> >
(std::locale::classic() )
.scan_not(std::ctype_base::digit, p_str, p_str+strlen(p_str) );
return p_ret == p_str+strlen(p_str);
}
(is_number verpackt eigentlich nur ctype<char>::scan_not)
Noch nen Alternativvorschlag:
return ( !(strspn(string, "0123456789") - strlen(string) ) );
strspn gibt zurück wie oft eins von 0123456789 in string vorkommt (vom Anfang an nacheinander), strlen die Zahl zeichen. Das ganze ist 0 wenns nur Ziffern sind also noch ein ! um daraus ein true zu machen.
MfG Peschmä
und wenn man jetzt noch auf das '!' verzichten will und auf die "unschöne" Eigenschaft von C++ zahlen als true/false zu interpretieren macht man einfach:
return ( strspn(string, "0123456789") == strlen(string) );
peschmae
12-03-2005, 15:33
Hmm, lol, hat was :)
MfG Peschmä
Hi!
Oder man nimmt gleich reguläre Ausdrücke.
Gruß
fuffy
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.