Forum: Mikrocontroller und Digitale Elektronik Zu einem String etwas addieren


von Stefan B. (sibbl) Benutzerseite


Lesenswert?

Hallo,

erstmal ein Stück vom Code, dann die Frage:
1
  char* orig = empfang;
2
  char str_lat[9];
3
4
  strncpy(str_lat, orig, 8);
5
6
  str_lat[0] = str_lat[0];
7
  str_lat[1] = str_lat[1];
8
  str_lat[2] = str_lat[2];
9
  str_lat[3] = str_lat[3] + 1;
10
  
11
  // Da durch die Addition ein zweistelliger String herauskommen kann, wird so der String wieder einstellig gemacht
12
  if (str_lat[3] > 9) str_lat[3] = str_lat[3] - 10;
13
14
  str_lat[4] = str_lat[4];
15
  str_lat[5] = str_lat[5];
16
  str_lat[6] = str_lat[6];
17
  str_lat[7] = str_lat[7];
18
  str_lat[8] = '\0';

Ich möchte gerne bei einem String in dem Fall str_lat[3] etwas dazu 
addieren. str_lat[3] muss allerdings einstellig bleiben. Deswegen die 
IF-Abfrage darunter.

Wenn jetzt str_lat[3] den Wert 5 hat und ich 1 dazu addiere, dann sollte 
doch str_lat[3] den Wert 6 haben? Allerdings funktioniert das so nicht.

Würde mir bitte jemand sagen, warum das so nicht funktioniert?


Gruss Stefan

von Peter II (Gast)


Lesenswert?

ich versteht noch nicht was du machen willst.

Sind in dem String Ziffern ('0'-'9')?


Dann macht das wenig sinn:
1
str_lat[3] > 9)

es müsste dann
1
str_lat[3] > '9')

sein.

von Karl M. (Gast)


Lesenswert?

Hallo Stefan,

Nur für Daten vom Type Zahl: byte, integer, long integer usw. kann man 
mathematische Operatoren definieren.

Wenn deine Strings ein "Körper" sind, gibt es wohl so etwas wie 
mathematische Operatoren.

von Peter II (Gast)


Lesenswert?

Karl M. schrieb:
> Wenn deine Strings ein "Körper" sind, gibt es wohl so etwas wie
> mathematische Operatoren.

im Computer schon.

ein char '1' + 1 = char '2'

von Stefan B. (sibbl) Benutzerseite


Lesenswert?

Peter II schrieb:
> ich versteht noch nicht was du machen willst.
> Sind in dem String Ziffern ('0'-'9')?
>
> Dann macht das wenig sinn:str_lat[3] > 9)
>
> es müsste dann str_lat[3] > '9')
>
> sein.

Ja, in str_lat[3] sind die Ziffern '0'-'9' enthalten. Ich möchte diesen 
String sozusagen manipulieren.

von Stefan F. (Gast)


Lesenswert?

Was sollen diese Zeilen bewirken?:
1
  str_lat[0] = str_lat[0];
2
  str_lat[1] = str_lat[1];
3
  str_lat[2] = str_lat[2];
4
  str_lat[4] = str_lat[4];
5
  str_lat[5] = str_lat[5];
6
  str_lat[6] = str_lat[6];
7
  str_lat[7] = str_lat[7];

von Georg G. (df2au)


Lesenswert?

Stefan B. schrieb:
> str_lat[0] = str_lat[0];

Aus reiner Neugier gefragt: Was soll diese Zeile bewirken?


> if (str_lat[3] > 9) str_lat[3] = str_lat[3] - 10;
mach mal:
if (str_lat[3] > '9') str_lat[3] = str_lat[3] - 10;


> Wenn jetzt str_lat[3] den Wert 5 hat und ich 1 dazu addiere, dann sollte
> doch str_lat[3] den Wert 6 haben? Allerdings funktioniert das so nicht.
Das sollte funktionieren, auch, wenn es übler Hack ist. Was erhältst du 
als Ergebnis?

von Stefan F. (Gast)


Lesenswert?

> Da durch die Addition ein zweistelliger String herauskommen kann,

Das kann gar nicht sein.

Erstmal solltest du ganz dringend lernen, zwischen Zeichen, Strings und 
Integer zu unterscheiden.

Du kannst zu einem Char addieren, was du willst, es wird immer ein Char 
bleiben. Die Länge des Strings kann sich dadurch unmöglich verändern.

Weiterhin ist "addieren" eine Mathematische Operation mit numerischen 
Operanden. Strings kann man nicht addieren.

In viele Scriptsprachen sind Ausdrücke wie "s3=s1+s2" möglich. Dabei 
handelt es sich jedoch nicht um eine Addition, sondern um eine 
Verkettung. In C verkettet man String mit strcat() oder strncat(). Mit 
itoa() wandelst du eine Integer Zahl in eine Zeichenkette um, atoi() 
mach das Gegenteil.

Man kann auch sprintf() benutzen, um Zeichenktten mit Zahlen zu 
verbinden, allerdings belegt printf eine Menge Speicher.
1
char buffer[100];
2
sprintf(buffer,"Ich bin %02i Jahre alt",42);
Hier wird die Zahl 42 in den String "42" umgewandelt. Falls die Zahl 
einstellig ist (z.B. 9), wird eine 0 voran gestellt, also "09". Printf 
kann noch mehr, lies die Doku dazu, falls Interesse besteht.

von MaWin (Gast)


Lesenswert?

Stefan B. schrieb:
> // Da durch die Addition ein zweistelliger String herauskommen kann,

Unsinn. Aus der Ziffer an Position 3 im String kann höchstens aus einer 
'9' ein ':' werden. Dort ist nur eine Ziffer und es wird immer eine 
bleiben, eventuell dann halt eine unleserliche.

> wird so der String wieder einstellig gemacht
1
if (str_lat[3] > '9') str_lat[3] = str_lat[3] - 10;
Und wohin mit dem Übertrag ?
1
str_lat[2]+=1;
und was, wenn dort wieder ein Übertrag auftritt ?
1
if (str_lat[2] > '9') 
2
{ 
3
   str_lat[2]='0';
4
   str_lat[1]+=1;
5
}
und wenn dort wieder ein Übertrag auftritt ?
1
if (str_lat[1] > '9') 
2
{ 
3
   str_lat[1]='0';
4
   str_lat[0]+=1;
5
}
und wenn dort wieder ein Übertrag auftritt ?

Der Strin g kann nicht nach vorne erweiter werden,
er muss nach hinten geschoben werden damit Platz ist für die führende 
'1'.
1
if (str_lat[0] > '9') 
2
{ 
3
   str_lat[0]='0';
4
   memmove(str_lat+1,str_lat,8);
5
   str_lat[0]='1';
6
}
und weil man dann gar nicht weiss, ob der NUL-Terminator an Position 8 
oder 9 soll, pappt man den besser vorher dran.
1
  char* orig = empfang;
2
  char str_lat[9];
3
4
  strncpy(str_lat, orig, 8);
5
  str_lat[8] = '\0';
6
  ltoa(atol(str_lat)+10000,str_lat,10);
mal vorausgesetzt, die long auf deinem Rechner haben 32 bit.

von Stefan B. (sibbl) Benutzerseite


Lesenswert?

Erstmal vielen Dank für die zahlreichen Antworten. Ich bin momentan 
nicht zuhause und habe nicht gleich mit so schnellen Antworten 
gerechnet.

Das ganze wird für einen Stratosphärenflug ein GPS-Verfälscher. Die 
GPS-Positionen kommen als String vom Unterprogramm an. Da ich im 
Unterprogramm nichts umbauen möchte, muss ich den String im 
Hauptprogramm wieder aufdröseln, die Position, welche ich geändert haben 
möchte ändern und dann wieder alles zum Weiterverarbeiten zusammenbauen.

Es soll NUR der str_lat[3] geändert werden, nicht der str_lat[2] oder 
der str_lat[4].

Ich werds morgen nochmal geändert ausprobieren.

Man kann das auch mit for-Schleifen machen, doch bevor ich das mache, 
sollte es erstmal so funzen.

Danke erstmal an alle.....

von Peter II (Gast)


Lesenswert?

Stefan B. schrieb:
> Das ganze wird für einen Stratosphärenflug ein GPS-Verfälscher.

geht es dir darum, das nicht jeder die Daten mitlesen kann? Dann sollte 
man sie lieber verschlüsseln.

von Hanswurst (Gast)


Lesenswert?

Nur mal so aus Neugierde: Wozu benötigt man bei einem Stratosphärenflug 
einen GPS-Verfälscher?

von Erwin D. (Gast)


Lesenswert?

Hanswurst schrieb:
> Nur mal so aus Neugierde: Wozu benötigt man bei einem
> Stratosphärenflug einen GPS-Verfälscher?

Damit die eigentlichen Eigentümer die Ladung selbst bergen können. Sonst 
tun das gerne irgendwelche "Geier".

von Andi (Gast)


Lesenswert?

Die unverändereten Zeichen im String brauchst du nicht zu "kopieren", 
die bleiben einfach wie sie sind.
Um eine Zahl zu dem Zahlen-Character zu addieren wandelst du zuerst in 
eine Integer Zahl 0..9 addierst dann und anschliessend machst du wieder 
ein ASCII Zeichen daraus. Der Modulo Operator % stellt sicher dass die 
Zahl im Bereich 0..9 bleibt:
1
 str_lat[3] = (str_lat[3] - '0' + 1) % 10 + '0';

Andi

von Hanswurst (Gast)


Lesenswert?

@ Erwin

Ah.

Da kann man nur hoffen, dass es sich um kleine, sprich Anfängergeier 
handelt. Die grossen Geier werden sicher noch zusätzlich peilen und in 5 
Minuten, den Offset heraus haben. Es reichen ja ein paar Tausend Meter 
Offset zwischen zwei Peilungen. Besser wäre vielleicht eine 
Verschlüsselung. Aber gut. Danke für die Antwort.

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.