atoi problem

OP #266458
Lesenswert?
• ▲
▼
hallo,

hab hier mal ein problem bei dem ich nicht so richtig weiter weis.

mein atmega16 bekommt über die rs232 zeichen gesendet, welche ich nun
als integer benutzen möchte. beispiel:

ascii zeichen "1" wird gesendet ==> umwandeln in integer

hab das ganze so gelöst:

uint_t test;
char speicher[7];

itoa(speicher[2],buffer,10);
lcd_puts(buffer);
hier nur mal um zu sehen was gesendet wurde z.B. 49 für die 1, 50 für
die 2, usw. das funktioniert soweit.


test=atoi(speicher[2]);
lcd_puts(test);
wenn ich nun das umwandle und wieder ausgebe kommt jedoch immer 0
herraus, was mach ich da falsch?

gruß
michael
Persönliche Seite #266462
Lesenswert?
• ▲
▼
Nein, ich habe mich nicht verlesen; es geht um atoi, nicht um itoa
(zumindest behauptet das der Titel des Thread).


  > hab das ganze so gelöst:
  >
  > uint_t test;
* > char speicher[7];
  >
  > itoa(speicher[2],buffer,10);
  > lcd_puts(buffer);
  >
  (...)
  >
* > test=atoi(speicher[2]);
  > lcd_puts(test);

(die mit * versehenen Zeilen sind die kritischen)

Natürlich geht lcd_puts mit einem anderen Parameter als einem Pointer
auf char auch in die Hose; 's wäre ja zu einfach, wenn Leute hier
ordentlich nur einen Fehler je Fragestellung machen würden :-)
Persönliche Seite #266465
Lesenswert?
• ▲
▼
.

  test=atoi(&speicher[2]);  // richtigs lösung

Das ist nur dann eine richtige Lösung, wenn im Array speicher irgendwo
hinter dem dritten Wert ein NUL-Zeichen ('\0') steht.

atoi erwartet einen Pointer auf einen nullterminierten String.

Wenn also speicher z.b. so gefüllt ist:

speicher[0] = 'x';  // uninteressant
speicher[1] = 'x';  // uninteressant
speicher[2] = '9';
speicher[3] = '0';
speicher[4] = '2';
speicher[5] = '3';
speicher[6] = '7';

dann geht die ganze Chose in die Hose. speicher[6] muss unbedingt mit
'\0' (resp. 0x00) initialisiert werden.

Auch solltest Du Dir dessen bewusst sein, daß atoi(&speicher[2]) in
diesem Falle eine ziemlich große Zahl zurückgibt, nämlich 9023 oder
eine mit einem 16-Bit-Int nicht darstellbare Zahl 90237... (ersteres,
wenn speicher[6] mit '\0' gefüllt ist, letzteres, wenn
zufälligerweise im Speicher hinter dem letzten Element des Arrays ein
NUL-Zeichen steht).


Übrigens kann man statt

  atoi(&speicher[2]);

auch

  atoi(speicher + 2);

schreiben. Damit wird vielleicht etwas deutlicher, daß atoi sich nicht
mit einzelnen Zeichen beschäftigt ...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 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.