Also ich schreibe gerade ein Programm für einen 8051er. In diesem wird z.B ein Zahlenwert von der Console(RS232) eingelesen. Dieser muss weiterverarbeitet werden. Jetzt zum Problem, das atoi liefert ja keine Rückmeldung, wenn etwas schiefläut. Wie kann ich einfach, ohne die Funktion strtol, das Programm robust gegen Falscheingaben machen? Mit fällt gerade nix ein, außer über das char* zu loopen und dann testen, welchen Wert es in Ascii hat. Hat der aktuelle Index einen anderen Wert als Dezimal 48 - 57 (gültiger Charinput: 0-9) dann verwerfen. Gibt es eine einfachere Möglichkeit? Die Eingabe kommt von inputse(). MfG Bastian
Bastian N. schrieb: > welchen Wert es in Ascii hat. dafür gibt es in c "isdigit()" Wenn die Zahl nicht 0 sein kann kannst du einfach auf 0 testen. Bei nichtnumerischen Strings liefert atoi() 0 zurück
Der Andere schrieb: > Bastian N. schrieb: >> welchen Wert es in Ascii hat. > > dafür gibt es in c "isdigit()" > Wenn die Zahl nicht 0 sein kann kannst du einfach auf 0 testen. Bei > nichtnumerischen Strings liefert atoi() 0 zurück Leider gibt es isdigigt beim Wickenhäuser wohl nicht - mal wieder:
1 | // testmain.c 14: Warning: missing prototype for function 'isdigit()' |
2 | |
3 | |
4 | |
5 | /****************************************************** |
6 | * CTYPE.H |
7 | * (C) 2002 Juergen Wickenhaeuser |
8 | *******************************************************/ |
9 | |
10 | char tolower(char c); |
11 | char toupper(char c); |
12 | |
13 | // EOF |
Danke dir trotzdem. Muss nächstes mal wieder dazuschreiben das ich Wickenhäuser IDE benutze. Hab jetzt das selbst implementiert:
1 | //...
|
2 | char input = '4'; |
3 | if((input < 48) || (input > 57)) |
4 | //...
|
Wgn atoi: Das liefert beim Wickenhäuser nicht immer (bei Falscheingabe) eine zurück - z.B bei 4f - habe ich getestet:
1 | /************************************** |
2 | * ATOI.C: ASCII to Integer |
3 | * |
4 | * (C) 2002 Juergen Wickenhaeuser |
5 | * |
6 | **************************************/ |
7 | |
8 | #include <stdio.h> |
9 | |
10 | /* ASCII to Integer */ |
11 | int atoi(far char* pc){ |
12 | uint val=0; |
13 | uchar c; |
14 | uchar flags=0; // 128: Neg, >1: Pos |
15 | for(;;){ |
16 | c=*pc++; |
17 | if(!flags){ // Phase 0: WS |
18 | if(c==' ' || c=='\t') continue; |
19 | else flags=1; |
20 | } |
21 | |
22 | if(flags==1){ |
23 | if(c=='-') { |
24 | flags=128; |
25 | continue; |
26 | } |
27 | flags=2; |
28 | if(c=='+'){ |
29 | continue; |
30 | } |
31 | } |
32 | if(c<'0' || c>'9') break; |
33 | val*=10; |
34 | val+=(c-'0'); |
35 | } |
36 | return (flags==128)?(-(int)val): val; |
37 | } |
38 | |
39 | // EOF |
MfG Bastian Und @Moderator bin zufällig auf den Meldeknopf gekommen, weil nicht richtig gelesen - sorry.
:
Bearbeitet durch User
Bastian N. schrieb: > Jetzt zum Problem, das atoi liefert ja keine Rückmeldung, wenn etwas > schiefläut. Dafür gibt's normalerweise strtol(), aber mir schwant, dass deine leicht eingeschränkte Arbeitsumgebung auch dieses mal wieder bloß nicht kennen wird. :/
Bastian N. schrieb: > if((input < 48) || (input > 57)) Du kannst auch schreiben if((input < '0') || (input > '9')) das ist meiner meinung nach verständlicher Siehe auch deine gepostete atoi() funktion dort wirds auch so gemacht.
Der Andere schrieb: > Bei > nichtnumerischen Strings liefert atoi() 0 zurück nein, bei "1234x" liefert 1234
Was ich noch sagen wollte, habe gestern ja mich mit atoi rumgequält, weil es einfach irgendeinen Wert z.B. bei 4f zurück geliefert hat. Jetzt habe ich es nochmal Vanilla probiert und atoi verhält sich wie beschrieben. Leider habe ich den alten Code nicht mehr, da verworfen. Vielleicht hatte ich irgendein Speicherproblem verursacht (Bufferunder/overflow) wer weiß. Aber da war auf atoi kein Verlass. Kann es gerade aber leider nicht mehr nachstellen. Thema ist aber hiermit erledigt :)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.