Hallo liebe Gemeinde, ich habe einen String der lautet: 1234T1 und diesen String möchte ich gerne in int var speichern... Problem ich möchte haben: uint8_t stelle12; also bis 99 im Beispiel = 12 uint8_t stelle34; also bis 99 im Beispiel = 34 char kennung[1]; im Beispiel = 'T' uint8_t stbit; im Beispiel = 1 mit atoi kann ich nur eine Stelle speichern (-48 wegen ascii) hier mein erster Lösungsansatz der so mit atoi leider nicht funktioniert (warum ist mir auch klar) //Stelle 1 und 2 wird als eine Zahl in uint8_t stelle12 gespeichert for(j=0;j<=1;j++) buffer[j]=scan[j]; stelle12=atoi(buffer); j=0; //Stelle 2 und 3 wird als eine Zahl in uint8_t stelle34 gespeichert for(j=0;j<=1;j++) buffer[j]=scan[j+2]; stelle34=atoi(buffer); j=0; hat jmd eine idee, wie man es machen könnte, ich benötige leider die Zahlen größer als einstellig.... Vielen Dank
ich schätze du solltest die chars einzeln verarbeiten. in etwa so: int i = atoi(buf[0]) | atoi(buf[1]) << 8; oder umgekehrt.
wenn die länge fix ist.
1 | char tmp[] = "1234T1" |
2 | |
3 | uint8_t i1 = (tmp[0]-'0')*10 + tmp[1]-'0'; |
4 | uint8_t i2 = (tmp[2]-'0')*10 + tmp[3]-'0'; |
5 | char c1 = tmp[4]; |
6 | uint8_t i3 = tmp[5]-'0'; |
1 | char tmp[3]; |
2 | strncpy(tmp, scan, 2); |
3 | tmp[2]=0; |
4 | |
5 | stelle12=atoi(tmp); |
6 | stelle34=atoi(scan+2); |
1 | char s[7] = "1234T1"; |
2 | int a, b, d; |
3 | char c; |
4 | |
5 | sscanf( s, "%2d%2d%c%1d", &a, &b, &c, &d ); |
Vielen Dank für die schnellen Antworten, habe den Fehler gefunden, der Buffer war eine Stelle zu klein und es gab einen Überlauf also funzt meine Lösung nur muss der Puffer (ganz klar) [3] groß sein! Bin nicht so erfahren, aber warum nicht atoi?? wenn es so funzt, was könnte es für Probleme bereiten?
char Eini [] = "1234T1"; char Aussi [3]; uint_8 Zahl1; uint_8 Zahl2; uint_8 Zahl3; char Type; Aussi [ 2 ] = '\0'; Aussi [ 0 ] = Eini [ 0 ]; Aussi [ 1 ] = Eini [ 1 ]; Zahl1 = atoi ( Aussi ); Aussi [ 0 ] = Eini [ 2 ]; Aussi [ 1 ] = Eini [ 3 ]; Zahl2 = atoi ( Aussi ); Type = Eini [ 4 ]; Aussi [ 1 ] = Eini [ 5 ]; Zahl3 = atoi ( &Aussi [ 1 ] ); Ein halber Blick in ein "C"-Buch und Du hättest Das Ganze auch selber geschafft!
Amateur schrieb: > Ein halber Blick in ein "C"-Buch und Du hättest Das Ganze auch selber > geschafft! eventuell wollte er ja eine schnelle (Ressourcen schonende) alternative. Das ist deine bestimmt nicht. 3 Funktionsaufrufe und noch 3 Byte auf dem Stack.
Heiko K. schrieb: > Bin nicht so erfahren, aber warum nicht atoi?? wenn es so funzt, was > könnte es für Probleme bereiten? keine Probleme, es könnte nur zu "langsam" sein wenn viele Daten verarbeitet werden. Und es braucht halt etwas mehr Speicher, weil die Funktion atoi eingebunden werden muss und man noch zusätzlich Daten umkopiert was eigentlich nicht notwendig ist.
Die -48 lassen sich auch durch eine Bitmaskierung ausdrücken, und diese liesse sich effizient auf vier oder acht Zeichen auf einmal anwenden je nach System. Ist natürlich nicht sauber oder portabel :)
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.