Korrekt input / konvertering

Tags:    c++

Jeg er løbet ind i følgende problem flere gange, så jeg håber at der er nogen der kan hjælpe:

Hvordan sikrer man at en indtastet streng er korrekt?

Fx at strengen er på formen tt:mm:ss, hvis der forventes et tidspunkt som input? Man kunne sikkert godt lave en utrolig lang række if'er, der tjekkede hvert enkelt bogstav/tal på følgende måde:

stringstream ss;
char c;
bool valid;
if(ss.get(c)) {
if(isdigit(c)) {
if(ss.get(c)) {
if(isdigit(c)) {
if(ss.get(c) {
if(c==':') valid = true;
}
}
}
}
}

Dette virker dog meget uoverskueligt.
Er det bedre at bruge try / catch (hvis ja, hvordan), eller findes der noget endnu bedre?



7 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Du kan bruge et regular expression library og så checke mod det:
Fold kodeboks ind/udKode 


Og en lille test:
Fold kodeboks ind/udKode 


Det var en meget simpel regular expression og følgende dato vil også fremstå som korrekt:
99/99/9999

...og denne:
29/02/2003

...men læs lidt om regular expressions, så burde den første i hvert fald være nem nok at fixe.

http://www.regular-expressions.info/dates.html



Indlæg senest redigeret d. 05.05.2006 19:56 af Bruger #2695
Det ser jo godt ud. :D
Jeg kigger på det i løbet af weekenden.



Den her er lidt mere generel:
Fold kodeboks ind/udKode 


Og så kan man efter at have trukket de enkelte dele af datoen ud også lave tjecks på deres størrelser. Det er lidt nemmere at gøre det i C/C++ end i regular expressions.
Her er et par tests:
Fold kodeboks ind/udKode 


Regexx biblioteket (som jeg bruger her) findes kun til Unix, men der findes sikkert lignende libs til Windows.



Man kan også bruge stringstream:

Fold kodeboks ind/udKode 


Den checker dog ikke at timer/minutter/sekunder er nøjagtigt 2 cifre.



Jeg har prøvet at finde noget lignende regexx.
Jeg fandt frem til regex++, som kan hentes fra:
http://ourworld.compuserve.com/homepages/John_Maddock/regexpp.htm

Problemet er, at jeg bruger borland comand line compiler, men kan ikke få det til at compile (jeg ved med andre ord ikke hvor jeg skal placere filerne). Er der nogen der kan hjælpe med det, eller evt. foreslå et andet lib?



Fandt ud af det. Det viste sig at jeg skulle skrive
make -fbcb5.mak
og ikke
make bcb5.mak

Tak for hjælpen.
Robert Larsen, hvis du vil have point, så bare lav et svar.



Ellers tak, behold dem bare. Jeg får dem aldrig selv brugt :-)



t