Forum: Compiler & IDEs Umwandlung von char* in Integer mit atoi


von Bastian N. (Firma: Privat) (seal)


Lesenswert?

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

von Der Andere (Gast)


Lesenswert?

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

von Bastian N. (Firma: Privat) (seal)


Lesenswert?

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
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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. :/

von Der Andere (Gast)


Lesenswert?

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.

von Walter S. (avatar)


Lesenswert?

Der Andere schrieb:
> Bei
> nichtnumerischen Strings liefert atoi() 0 zurück

nein, bei "1234x" liefert 1234

von Bastian N. (Firma: Privat) (seal)


Lesenswert?

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
Noch kein Account? Hier anmelden.