Umwandlung von char* in Integer mit atoi

OP (Firma: Privat) #5019585
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
OP (Firma: Privat) #5019657
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.
OP (Firma: Privat) #5020562
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 :)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.