mikrocontroller.net

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


Autor: Bastian N. (Firma: Privat) (seal)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Der Andere (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bastian N. (Firma: Privat) (seal)
Datum:

Bewertung
0 lesenswert
nicht 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:
// testmain.c 14: Warning: missing prototype for function 'isdigit()'



/****************************************************** 
* CTYPE.H
* (C) 2002 Juergen Wickenhaeuser
*******************************************************/

char tolower(char c);
char toupper(char c);

// EOF
Danke dir trotzdem. Muss nächstes mal wieder dazuschreiben das ich 
Wickenhäuser IDE benutze.

Hab jetzt das selbst implementiert:
//...
char input = '4';
if((input < 48) || (input > 57))
//...

Wgn atoi: Das liefert beim Wickenhäuser nicht immer (bei Falscheingabe) 
eine zurück - z.B bei 4f - habe ich getestet:
/**************************************
* ATOI.C: ASCII to Integer 
*
* (C) 2002 Juergen Wickenhaeuser
*
**************************************/

#include <stdio.h>

/* ASCII to Integer */
int atoi(far char* pc){
  uint val=0;
  uchar c;
  uchar flags=0;  // 128: Neg, >1: Pos
  for(;;){
    c=*pc++;
    if(!flags){  // Phase 0: WS
      if(c==' ' || c=='\t') continue;
      else flags=1;
    }

    if(flags==1){
      if(c=='-') {
        flags=128;
        continue;
      }
      flags=2;
      if(c=='+'){
        continue;
      }
    }
    if(c<'0' || c>'9') break;
    val*=10;
    val+=(c-'0');
  }    
  return  (flags==128)?(-(int)val): val;
}

// EOF

MfG
Bastian


Und @Moderator bin zufällig auf den Meldeknopf gekommen, weil nicht 
richtig gelesen - sorry.

: Bearbeitet durch User
Autor: Jörg W. (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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. :/

Autor: Der Andere (Gast)
Datum:

Bewertung
2 lesenswert
nicht 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.

Autor: Walter S. (avatar)
Datum:

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

nein, bei "1234x" liefert 1234

Autor: Bastian N. (Firma: Privat) (seal)
Datum:

Bewertung
-1 lesenswert
nicht 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 :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.