Zu einem String etwas addieren

OP Persönliche Seite #4657540
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
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.
Gast
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
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];
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
> 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
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
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
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
@ 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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.