Hallo, eine kleine Frage. ich enpfange 3 ASCII Bytes mit einem Mega8 über die UART. Nun möchte ich diesen String in eine INT Zahl wandeln. Leider verzweifele ich daran bald. Mein Ansatz sieht wie folgt aus: Ich schreibe drei ASCII Zahlen in einen "empfangs_sring", will dann den "empfangs_string" in Int wandeln. Problem, "Wert" ist immer 0. char empfangs_string[4]; unsigned int Wert = 0; Die Funktion zur Wandlung: empfangs_string[0] = '\0'; while(RxBufferStatus()==0); myReceivedByte = RxBufferLesen(); strcat(empfangs_string, myReceivedByte); while(RxBufferStatus()==0); myReceivedByte = RxBufferLesen(); strcat(empfangs_string, myReceivedByte); while(RxBufferStatus()==0); myReceivedByte = RxBufferLesen(); strcat(empfangs_string, myReceivedByte); Wert = atoi(empfangs_string); Bitte um etwas Hilfe. Gruß Bernd
strcat kann nicht dazu verwendet werden, einzelne Zeichen an einen String anzuhängen. Du könntest aber folgendermaßen vorgehen:
1 | for (i = 0; i < 3; i++) |
2 | {
|
3 | while(RxBufferStatus()==0); |
4 | empfangs_string[i] = RxBufferLesen(); |
5 | }
|
6 | |
7 | empfangs_string[3] = '\0'; |
8 | |
9 | Wert = atoi(empfans_string); |
Hallo, danke für die schnelle Hilfe, womit kann man einzelne Zeichen anfügen? Geht das überhaupt? Dein Vorschlag hat auf Anhieb geklappt, nur fügt die atoi leider keine Nullen bei kleinen Werten voran. Gruß Bernd
Bernd B. schrieb: > Hallo, > > danke für die schnelle Hilfe, > womit kann man einzelne Zeichen anfügen? händisch > Geht das überhaupt? händisch gehts immer. Aber um die str... Funktionen zu nutzen, brauchst du zuallererst Strings. Nur weil du ein paar Zeichen in ein Array schreibst, hast du deswegen noch lange keinen String. Ein String hat immer ein \0 Byte am Ende, das sein Ende markiert. SChreibst du selber keines rein, dann hast du auch keinen String. Und strcat hängt nun mal einen String an einen anderen an. (Aber es steht dir natürlich frei, dir eine Funktion charcat zu machen, die ein einzelnes Zeichen an einen String anhängt)
1 | void charcat( char* str, char c ) |
2 | {
|
3 | while( *str ) |
4 | str++; |
5 | *str++ = c; |
6 | *str = '\0'; |
7 | }
|
Jetzt hast du eine Funktion, die an einen String ein einzelnes Zeichen anhängt.
1 | empfangs_string[0] = '\0'; |
2 | |
3 | while(RxBufferStatus()==0); |
4 | charcat( empfangs_string, RxBufferLesen() ); |
5 | |
6 | while(RxBufferStatus()==0); |
7 | charcat( empfangs_string, RxBufferLesen() ); |
8 | |
9 | while(RxBufferStatus()==0); |
10 | charcat( empfangs_string, RxBufferLesen() ); |
11 | |
12 | Wert = atoi(empfangs_string); |
> nur fügt die atoi leider keine Nullen bei kleinen Werten voran.
atoi erzeugt eine Zahl!
Was immer deren Wert ist, ist ihr Wert
Was du dann bei einer erneuten Ausgabe aus dieser Zahl machst, ob du sie
mit führenden 0-en ausgibst oder nicht, ist eine andere Geschichte.
Karl heinz Buchegger schrieb: > Wert = atoi(empfangs_string); wobei atoi auch nicht unbedingt der Weisheits letzterschluss, den im Fehler fall zum beispiel
1 | WERT atoi("AAA"); |
prüft atoi nicht und liefert im Zweifel 0. Das Problem kann sein das diese auch ein Sinnvoller Wert ist und du so mit keine Möglichkeit der Fehler Behandlung hast. Sei also vorsichtig beim einsatz diese Funktion und Programmier dir im Zweifel lieber was mit Fehler Händler ist auch nicht so schwer das zu Implementieren. Ich würde das so machen
1 | int my_atoi(char *str, void (*trap)(void) ) |
2 | {
|
3 | int i=0; |
4 | int value=0; |
5 | int digit= 0; |
6 | |
7 | if (str == NULL ) { |
8 | trap(); |
9 | return 0; |
10 | }
|
11 | |
12 | while ( str [i] != '\0' ) { |
13 | switch (str[i]) { |
14 | case '0': digit = 0; break; |
15 | case '1': digit = 1; break; |
16 | case '2': digit = 2; break; |
17 | case '3': digit = 3; break; |
18 | case '4': digit = 4; break; |
19 | case '5': digit = 5; break; |
20 | case '6': digit = 6; break; |
21 | case '7': digit = 7; break; |
22 | case '8': digit = 8; break; |
23 | case '9': digit = 9; break; |
24 | default : |
25 | trap(); |
26 | return 0; |
27 | break; |
28 | };
|
29 | value = value * 10 + digit; |
30 | i++; |
31 | }
|
32 | |
33 | return value; |
34 | }
|
35 | |
36 | void my_trap(void) |
37 | {
|
38 | /* Hier das Fehlerhändling Rein zum beispiel*/
|
39 | printf(" Wir werden Sterben !!! my_atoi geht schief\n"); |
40 | }
|
Der Aufruf im Programm wäre dann. val = my_atoi(empfangs_string ,my_trap); Alernativ kannst du dann in die While Schleife auch noch ein Händling einbauen wenn der String nach X Zeichen kein '\0' hat.
Imon schrieb: > Fehler Behandlung hast. Sei also vorsichtig beim einsatz diese Funktion > und Programmier dir im Zweifel lieber was mit Fehler Händler ist auch > nicht so schwer das zu Implementieren. Ich würde das so machen Schau dir mal strtol() an Allerdings geb ich dir recht, dass es zu Übungszwecken durchaus sinnvoll sein kann, sich sowas mal zu implementieren. Allerdings vernünftig. Du scheinst da ein Wahnsinns-Augenmerk auf den Error-Handler zu legen. Viel Aufwand für nichts. Wieder: schau dir strtol an, wie dort das Interface aussieht. Und über den switch-case ... geschenkt.
Imon schrieb: > prüft atoi nicht und liefert im Zweifel 0. Das Problem kann sein das > diese auch ein Sinnvoller Wert ist und du so mit keine Möglichkeit der > Fehler Behandlung hast. Sei also vorsichtig beim einsatz diese Funktion > und Programmier dir im Zweifel lieber was mit Fehler Händler Oder halt einfach strtol statt atoi nehmen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.