String[i] an einen String [20] hängen!

Gast #2145728
Lesenswert?

1
char Text [20] ;    // Text wäre zum Beispiel Hall
2
char Text2[10] ;    // und hier steht zb an Stelle Text[5] ein O
3
Text  [0] = '\0';           
4
Text2 [0] = '\0';



?! Wie bekomme ich es nun hin ,Text[5] an das Ende von Text zu hängen, 
sodass in dem Beispiel in Text insgesamt Hallo stehen würde ? .

Mit strcat hab ich es versucht allerdings geht das nicht weil Text[5] ja 
nur ein einzelnes Zeichen wäre aber kein ganzer String .

Gibt es hier eine unkomplizierte Lösung ? .

Die Variablen müssen leider deklariert bleiben wie sie sind .
Gast #2145734
Lesenswert?

Hey,

also mit strcat sollte das eigentlich möglich sein. Was jedoch nicht 
ganz richtig ist, dass du deine beiden C-Strings direkt im erstem 
Zeichen "null-terminierst". Damit wird strcat nichts anfangen können.
1
char Text [20] ;    
2
char Text2[10] ;   
3
strcpy(Text, "Hall");
4
strcpy(Text2, "o Welt!");
5

6
strcat(Text, Text2);

Wobei du stark darauf achten musst, wie groß deine einzelnen 
Zeichenketten sind. Text hat hier 20 Zeichen zur Verfügung, darüber 
hinaus darf nichts in den String geschrieben werden ;)

Kalka
Gast #2145742
Lesenswert?

Durch den ersten String elementweise durchgehen bis man das Null-Byte 
findet.
Ab dieser Stelle die Information des anzuhängenden Strings in den 
Zielstring reinkopieren (elementweise).
Allerdings sollte man prüfen, ob der Zielstring überhaupt groß genug 
ist.
:-)
Gast #2145752
Lesenswert?

Naja insgesamt wurden natürlich im Laufe des Programmtextes die beiden
Strings "gefüllt" .
1
int i = 0;
2
char Text [20] ;    // Text wäre zum Beispiel Hall
3
char Text2[10] ;    // und hier steht zb an Stelle Text[5] ein O
4
Text  [0] = '\0';           
5
Text2 [0] = '\0'; 
6

7
strcpy(Text, "Hall");
8
strcpy(Text2, "o~a~x~"
9

10
while (Text2[i] != '~')
11
{
12
strcat(Text,Text2[i]);  // diese Zeile funktioniert nicht 
13
i++;
14
}
15

16
// ...

So sollte es sein nur wie ich im Kommentar geschrieben habe geht die 
Zeile mit strcat leider nicht
Gast #2145757
Lesenswert?

DirkB schrieb:
> int Text_len = strlen(Text);
> Text[Text_len+1] = '\0';
> Text[Text_len]   = Text2[5];

Das dürfte so eigentlich nicht funktionieren, wenn du damit einen nicht 
null terminierten String versuchst "zu null-terminieren". Denn strlen 
sucht in der angegebenen Zeichnkette auch nur nach der '\0', um so die 
Länge zu ermitteln.

Am besten sollte sich der Topc-Starter nochmal genauer mit 
null-terminierten Strings beschäftigen, so kompliziert ist es im Prinzip 
nicht.

Viele Grüße,
  Kalka
Gast #2145770
Lesenswert?

Ich habe eine externe Komponente die direkt mit meinem AVR per UART 
verbunden ist .

Diese führt einige Aktionen durch und jedesmal wenn diese abgeschlossen 
ist terminiert sie diese mit ~ .
Dieser Text wird laufend gespeichert .
Nach 30 sec wird eine Funktion aufgerufen die zb sowas wie im Beispiel 
liefert "o~a~x~"

Jeder dieser Wörter vor "~" muss dann mit einem eigenen jeweiligen 
String verkettet werden, sodass ich am Ende in meinem Programm das 
gewünschte Messergebnis habe .


Alles in allem entspricht es von der Funktion her dem Beispiel
Gast #2145774
Lesenswert?

mhmh scheinbar kann man hier keine Beiträge editieren..

Christian schrieb:
> Naja insgesamt wurden natürlich im Laufe des Programmtextes die beiden
> Strings "gefüllt" .
>
> int i = 0;
> char Text [20] ;    // Text wäre zum Beispiel Hall
> char Text2[10] ;    // und hier steht zb an Stelle Text[5] ein O
> Text  [0] = '\0';
> Text2 [0] = '\0';
>
> strcpy(Text, "Hall");
> strcpy(Text2, "o~a~x~"
>
> while (Text2[i] != '~')
> {
> strcat(Text,Text2[i]);  // diese Zeile funktioniert nicht
> i++;
> }
>
> // ...
>
>
> So sollte es sein nur wie ich im Kommentar geschrieben habe geht die
> Zeile mit strcat leider nicht


strcat erwartet als Parameter 2 Zeiger. Du übergibst hier aber als 2. 
Parameter kein Zeiger, sondern direkt ein char. Weiterhin musst du bei 
strcat einen null-terminierten String übergeben. Einzelne Zeichen kannst 
du denke ich besser direkt kopieren, vllt. so:
1
int i = 0;
2
int len = 0;
3
char Text [20] ;    // Text wäre zum Beispiel Hall
4
char Text2[10] ;    // und hier steht zb an Stelle Text[5] ein O
5

6
strcpy(Text, "Hall");
7
strcpy(Text2, "o~a~x~");
8
 
9
i=0;
10

11
while (Text2[i] != '~')
12
{
13
  len = strlen(Text);
14
  Text[len+1] = Text2[i];
15
  Text[len+2] = 0;
16
  i++
17
}

So auf die schnelle geschrieben. Eine überprüfung auf einen Überlauf 
musst du da im Grunde aber noch hinzufügen, sonst ist es sehr 
Fehleranfällig.

Viele Grüße,
  Kalka
#2145783
Lesenswert?

einfach elementweise kopieren:
1
void String::operator+= (const char *s){
2
    // calc new length
3
    unsigned int newLength = slength+strlen(s);
4

5
    // check size
6
    if (size>=newLength){
7
      // copy chars
8
      for (unsigned int i=slength;i<newLength;i++){
9
        s_[i] = s[i-slength];
10
      }
11
      // set last char to \0 termination
12
      s_[newLength] = '\0';
13
    }
14

15
    // set new string length
16
    slength = newLength;
17
  };
Gast #2145792
Lesenswert?

Kalka schrieb:
> Das dürfte so eigentlich nicht funktionieren, wenn du damit einen nicht
> null terminierten String versuchst "zu null-terminieren".

Das ist schon klar.
Nur ist von Strings die rede und die sind in C nun mal Null-Terminiert.
Und wenn er nicht Null-Terminiert ist muss er die Länge kenne und kann 
sie statt Text_len einsetzen.

Wenn ich das richtig verstanden habe will er ein Zeichen an einen String 
anhängen.

Wenn er es einmalig braucht dann:
strncat(Text,&Text2[i],1);

Wenn er diese komische while-Schleife wegen der ~ braucht dann kann er 
es auch von 'Hand' machen indem er Text[j] ändert.

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