Forum: Mikrocontroller und Digitale Elektronik char string zerhacken und in int Variablen speichern


von René K. (tesla24)


Lesenswert?

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

von Edgar B. (ebull)


Lesenswert?

ich schätze du solltest die chars einzeln verarbeiten.

in etwa so:
int i = atoi(buf[0]) | atoi(buf[1]) << 8;

oder umgekehrt.

von Peter II (Gast)


Lesenswert?

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';

von Irgendwer (Gast)


Lesenswert?

1
char tmp[3];
2
strncpy(tmp, scan, 2);
3
tmp[2]=0;
4
5
stelle12=atoi(tmp);
6
stelle34=atoi(scan+2);

von Edgar B. (ebull)


Lesenswert?

hm, tja warum überhaupt atoi?

von Peter II (Gast)


Lesenswert?

Edgar Bull schrieb:
> hm, tja warum überhaupt atoi?

genau, deswegen habe ich es ja ohne gemacht.

von Peter D. (peda)


Lesenswert?

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 );

von René K. (tesla24)


Lesenswert?

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?

von Amateur (Gast)


Lesenswert?

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!

von Peter II (Gast)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

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.

von Andreas D. (rackandboneman)


Lesenswert?

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
Noch kein Account? Hier anmelden.