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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren