PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Rausfinden ob String ne nummer ist



Giuly
12-03-2005, 01:51
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.

Giuly
12-03-2005, 08:08
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? :)

Pingu
12-03-2005, 08:12
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?

wraith
12-03-2005, 08:17
man isdigit (http://www.hmug.org/man/3/isdigit.html)
Und da dann die Schleife drum bauen.

Giuly
12-03-2005, 08:35
Fast

Fehler gesehen?
ja true<=>false

KL47
12-03-2005, 08:44
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. :)

Giuly
12-03-2005, 08:56
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ä

Giuly
12-03-2005, 10:21
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ä

Jasper
12-03-2005, 14:33
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)

BeS
12-03-2005, 15:15
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ä

fuffy
18-03-2005, 09:17
Hi!

Oder man nimmt gleich reguläre Ausdrücke.

Gruß
fuffy