Forum: Mikrocontroller und Digitale Elektronik String[i] an einen String [20] hängen!


von Christian (Gast)


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 .

von Kalka (Gast)


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

von Marcus K. (marcusk)


Lesenswert?

Christian schrieb:
> Mit strcat hab ich es versucht allerdings geht das nicht weil Text[5] ja
> nur ein einzelnes Zeichen wäre aber kein ganzer String .
wie kommst du darauf? Was sagt dir denn den 5 wenn es nur ein zeichen 
ist? - es geht mit strcat. Aber woher soll denn das "Hallo" kommen?

strcat( Text, Text2 );

von Marcus K. (marcusk)


Lesenswert?

Kalka schrieb:
> 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.
warum nicht, was ist denn bei dir ein leerer String?

von Floh (Gast)


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.
:-)

von DirkB (Gast)


Lesenswert?

1
int Text_len = strlen(Text);
2
Text[Text_len+1] = '\0';
3
Text[Text_len]   = Text2[5];

von Christian (Gast)


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

von DirkB (Gast)


Lesenswert?

Oder
1
strncat(Text,Text2+5,1);
Beachte das n in stncat.

von Kalka (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

Christian schrieb:

> strcpy(Text, "Hall");
> strcpy(Text2, "o~a~x~"
>
> while (Text2[i] != '~')
> {
> strcat(Text,Text2[i]);  // diese Zeile funktioniert nicht
> i++;
> }


Was genau soll der Zweck dieses Codes sein.

Es geht sicher mit str Funktionen. Nur muss man wissen, was eigentlich 
das Ziel der ganzen Übung ist.

von Christian (Gast)


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

von Kalka (Gast)


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

von TestX .. (xaos)


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
  };

von DirkB (Gast)


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.

von Christian (Gast)


Lesenswert?

Habe es jetzt anders geregelt .
Vielleicht nicht ganz elegant aber es geht .

Text[y] = Text [i];
i++;
y++;

Wie gesagt geht .
Dennoch danke an alle ;-)

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.