Forum: Compiler & IDEs Probleme mit der atoi-Funktion


von Stephan (Gast)


Lesenswert?

Hallo Leute,

ich hab Probleme mit der atoi-Funktion. Ich lese aus einer Datei 
(config.dat) ein 9 stelligen Zahlenwert in den config_buffer ein. Diesen 
eingelesenen Zahlenwert möchte ich nun in einen int-Zahlenwert umwandeln 
und in zahlen_wert[i] schreiben. zahlen_wert[] ist global als unsigned 
in deklariert. Die ganze Geschichte funktioniert bis zu einer 5 
stelligen Zahl (z.B. 000012345), leider ab einer 6 stelligen Zahl 
(000123456) nicht mehr. Hat einer von euch eine Idee was ich falsch 
mache?

Ich dank euch.
Gruß
Stephan
1
  S32 config_offset = 0;
2
  unsigned char config_buffer[9];
3
  U8 mode_fseek = 0;
4
5
  config_offset = 188;
6
  Fopen("config.dat",'r');        //öffnen der config Datei
7
  for(i=0; i<15; i++)            //15 Schleifendurchläufe für 15 mögliche Identifier
8
  {
9
    config_offset = config_offset + 27;  //den Offset auf den ersten Identifier im Config-File setze
10
    Fseek(config_offset, mode_fseek);   //im Config-File von vorne um den Ofsett verschieben
11
    Fread(config_buffer, 9);       //auslesen von 9 Zeichen in den config_buffer
12
13
14
    zahlen_wert[i] = atoi(&config_buffer); 
15
  }
16
  Fclose();

von Gast (Gast)


Lesenswert?

Integer sind 2 Byte --> 2^16 = 65536!

Eine größere Zahl wirst du also zahlen_wert nicht reinbekommen. Wähle 
einen anderen Typ (longint z.B.)

von Stephan (Gast)


Lesenswert?

Danke für die schnelle Antwort. Leider funktioniert es als long 
zahlen_wert auch nicht. Gibts sonst noch Ideen?

von (prx) A. K. (prx)


Lesenswert?

atoi => integer, also -32768..32767 bei 8/16-Bit Controller. Für mehr: 
atol oder strtol verwenden.

von P. S. (Gast)


Lesenswert?

Stephan schrieb:
> Danke für die schnelle Antwort. Leider funktioniert es als long
> zahlen_wert auch nicht. Gibts sonst noch Ideen?

man-page von atoi lesen. Falls keine man-page vorhanden, im C-Buch 
gucken. Falls kein C-Buch vorhanden, umgehend bestellen. Bis dahin atol 
nehmen. Oder gleich strtol.

von Gast (Gast)


Lesenswert?

... bei letzterem (strtol) aber die Nullterminierung nicht 
vergessen...;-)

von (prx) A. K. (prx)


Lesenswert?

Weshalb? strtol/strtoul hört beim ersten Zeichen auf, das nicht ins 
Schema passt. Ob das \0 ist oder was anderes ist egal. Das ist bei 
atoi/atol auch nicht anders - wie auch?

von Stephan (Gast)


Lesenswert?

@ A. K. und Peter Stegemann

   Juhuuuuu! Mit atol funktioniert's.

@ Peter Stegemann

   C-Buch ist schon bestellt


Ich danke euch für eure schnelle Hilfe.

von Gast (Gast)


Lesenswert?

Ein Satz aus der man-Page:

The conversion is done according to the given base, which must be 
between 2
and 36 inclusive, or be the special value 0.

Prinzipiell hast du recht, steht ja auch in dem Satz, aber man weis ja 
nie, was das für Daten sind. Und Strings sollten immer mit \0 terminiert 
sein, um sich nicht über irgendwelche Nebeneffekte wundern zu müssen... 
(zumindestens nach meiner Meinung)

von (prx) A. K. (prx)


Lesenswert?

Irgendwie muss die Ziffernfolge beendet werden, dass ist klar. Aber wenn 
der Programmierer der Funktion(en) keinen grandiosen Mist gebaut hat, 
dann ist es egal ob das \0 oder ein Komma oder das Ende der Zeile ist.

Das ist ja grad der Witz an strtol. Man kann diese Funktion verwenden, 
um bestehende Zeichenfolgen mit enthaltenen Zahlen inkrementell zu 
parsen.

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.