Forum: Mikrocontroller und Digitale Elektronik Array in Array schreiben


von A. R. (and)


Lesenswert?

Hallo,

ich habe 2 Array´s die ich gerne in ein gemeinsames Array schreiben 
möchte, mit einem Sonderzwichen dazwischen.
Was ist bei mir im Quelltext falsch??

1
char s1 [4];
2
char s2 [4];
3
char array[9];
4
5
array = { s1, '/', s2 };



Fehlermeldung:

../Test1.c:194: error: expected expression before '{' token

von Dirk B. (dirkb2)


Lesenswert?

C-Grundlagen: Arrays
C-Grundlagen: Strings

Kannst du mit strcpy und strcat machen.

von A. R. (and)


Lesenswert?

Ok,
bekomm trotzdem eine Fehlermedung:
../Test1.c:197: error: too many arguments to function 'strcat'
1
strcat(array, s1, s2);

Include DAtei ist auch drin:
#include <string.h>

von Peter II (Gast)


Lesenswert?

A. R. schrieb:
> Ok,
> bekomm trotzdem eine Fehlermedung:
> ../Test1.c:197: error: too many arguments to function
> 'strcat'strcat(array, s1, s2);

einfach mal in die Doku schauen was strcat als Parameter braucht sollte 
man schon.

von Udo S. (urschmitt)


Lesenswert?

Programmieren ist nicht wie ein Aufsatz schreiben.
Man muss die Syntax und die Funktionen schon genau so benutzen wie sie 
definiert und deklariert sind.
Wie das genau geht lernst du in einem C Buch.

von Dirk B. (dirkb2)


Lesenswert?

Ich schrieb auch:

Kannst du mit strcpy und strcat machen.

Du brauchst beide Funktionen nacheinander.

Und die beiden können nicht mit einzelnen Zeichen umgehen.
Die brauchen Zeiger auf C-Strings (Nullterminierte Zeichenketten)

Kannst mal bei http://de.cppreference.com/w/c/string/byte nachschlagen.

Das ersetzt kein Lehrbuch über C.

von Joachim B. (jar)


Lesenswert?

Dirk B. schrieb:
> Kannst du mit strcpy und strcat machen.
>
> Du brauchst beide Funktionen nacheinander.
>
> Und die beiden können nicht mit einzelnen Zeichen umgehen.

komisch ich mache das öfter
1
char buffer[80] = {0};
2
3
strcpy(buffer, "1"); // genau ein Zeichen :-)
4
strcat(buffer, "2"); // und noch ein Zeichen

aber zum TO
1
char s1 [4];
2
char s2 [4];
3
char array[9];

logisch kannst du

strcpy(array, s1); // machen

aber das arry endet ja mit NULL und wenn du da was anhängst ist dein 
erstes Ende NULL weg, weil es immer nur ein Ende gibt.

nun kannst du ans erste s1 in array einen Trenner anhängen
strcat(array, "/");

und da wieder
strcat(array, s2);

willst du auf s1 zugreifen das liegt ja vorne

&array[0] und endet bei strstr(array, "/");

wo liegt s2? -> Übungsaufgabe

von Dennis S. (eltio)


Lesenswert?

Joachim B. schrieb:
> komisch ich mache das öfter
> char buffer[80] = {0};
>
> strcpy(buffer, "1"); // genau ein Zeichen :-)
> strcat(buffer, "2"); // und noch ein Zeichen

Das sind jeweils zwei Zeichen.. zumindest in C.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Dennis S. schrieb:
> Das sind jeweils zwei Zeichen.. zumindest in C.

Hehe. Wo er recht hat, hat er recht ;-)

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Dennis S. schrieb:
>> Das sind jeweils zwei Zeichen.. zumindest in C.
>
> Hehe. Wo er recht hat, hat er recht ;-)

das war C nicht ich :-)

und wenn du in ein Array 10x strcat(array, "A"); machst sind trotzdem 
nur 10 As hinzugekommen und keine 20 ;-)

von A. R. (and)


Lesenswert?

s1 und s2 kann Werte von 0-9999 (als ascii) annehmen oder halt auch 4 
Buchstaben.


Ich habe jetzt:
1
strcpy ( array, s1);
2
strcat ( array, '/');
3
strcat ( array, s2);


Also sollte im array dann folgendes stehen:
(z.B.: s1 = 1234 und s2=5678)

array = 1234/5678  (Index0 ist 8  und  Index9 ist 1)

von Dennis S. (eltio)


Lesenswert?

Joachim B. schrieb:
> Frank M. schrieb:
> und wenn du in ein Array 10x strcat(array, "A"); machst sind trotzdem
> nur 10 As hinzugekommen und keine 20 ;-)

DAS hat ja auch keiner behauptet.. :-P

von Udo S. (urschmitt)


Lesenswert?

A. R. schrieb:
> Index9

Ein Array der Größe 9 hat einen gültigen Index von 0 bis 8.
Ein String braucht ein Stringendekennzeichen, das ist das null Byte und 
dafür muss in dem Array Platz sein.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> und wenn du in ein Array 10x strcat(array, "A"); machst sind trotzdem
> nur 10 As hinzugekommen und keine 20 ;-)

Es sind 10 x A kopiert worden und 10 x '\0', also insgesamt 20 Zeichen 
kopiert worden. Denn strcat terminiert den Ziel-String - was übrigens 
strncat() nur bedingt macht.

P.S.
Man sollte NULL und NUL immer schön auseinanderhalten - gerade wenn man 
etwas einem C-Anfänger erklärt. NUL ist das ASCII-Zeichen '\0', was zur 
Terminierung von Strings benutzt wird (s. auch google: "man ascii").

NULL ist die Zahl 0, welche man oft für einen NULL-Pointer verwendet - 
aber nicht zur Terminierung von Strings - auch wenn beide Ausdrücke den 
gleichen numerischen Wert besitzen.

von A. R. (and)


Lesenswert?

Index9 war ein schreibfehler. Sollte Index8 sein.

von A. R. (and)


Lesenswert?

Also sollte die Variable wo ich mein s1, / und s2 reinschreibe so groß 
wie folgt sein??

s1 + / + s2 + "/0" spricht 4+1+4+1 = 10

von DirkB (Gast)


Lesenswert?

A. R. schrieb:
> Ich habe jetzt:
> strcpy ( array, s1);
> strcat ( array, '/');
> strcat ( array, s2);

Das '/' ist ein Zeichen. Deutlich erkennbar an den Hochkommas. Damit 
kommt strcat nicht zurecht.

A. R. schrieb:
> s1 + / + s2 + "/0" spricht 4+1+4+1 = 10

Das "\0" ist ein Stringliteral. Deutlich erkennbar an den 
Anführungszeichen. Da hängt der Compiler automatisch noch eine '\0' 
dran.

Ja, du brauchst mindestens Platz für 10 Zeichen.

Schließe nicht von dem Verhalten von anderen Hochsprachen auf C.
Schon gar nicht bei Arrays (und somit auch Strings).

von Fritz G. (fritzg)


Lesenswert?

Wenn s1 nur 4 Bytes hat, geht das strcpy in die Hose. Strcpy kopiert 
solange, bis ein Nullbyte kommt. Das selbe gilt für strcat.
Also muss s1 5 Bytes groß sein. s2 auch.

von kwler (Gast)


Lesenswert?

Alles hat ein Ende nur die Wurst hat zwei ;-)

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.