Zu einem String etwas addieren

OP Persönliche Seite #4657540
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
Gast #4657548
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.
Gast #4657555
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];
#4657558
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?
Gast #4657564
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.
Gast #4657583
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.
OP Persönliche Seite #4657661
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.....
Gast #4657767
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
Gast #4657769
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren