Hallo,
erstmal ein Stück vom Code, dann die Frage:
1
char*orig=empfang;
2
charstr_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
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.
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'
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.
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?
> 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
charbuffer[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.
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
charstr_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.
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.....
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.
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".
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:
@ 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.
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.