Forum: Mikrocontroller und Digitale Elektronik Array (2D) von char mit string unterschiedlicher Länge füllen


von Tom (Gast)


Lesenswert?

Hallo Welt,

ich stehe mit der ganzen Pointerthematik noch etwas auf Kriegsfuss, 
mache aber langsame Fortschritte. Trotzdem hänge ich.

Folgende Problem
1
char stringUser[10][30]
Dieses Array ist definiert, da im Code befüllt wird (via serielle 
Schnittstelle). Soweit so gut! Nun möchte ich aber in dieses 
10dimensionales Array Defaultwerte (z.B. Hans, Friedrich,Jo,..) 
einfüllen. Offensichtlich sind die Namen unterschiedlich lang, aber 
sollen je in dem 30 Byte großen Array abgelegt werden.

Wie weisse ich nun meine 10 Vornamen in den Array?
Dachte so was in der Art
1
stringUser[0] ="Hans"
2
stringUser[30] ="Friedrich"
3
stringUser[60] ="Jo"
4
...

natürlich geht das so nicht, ich vermute dass ich in Richtung Pointer 
arbeiten muss.
Habe mich an dem Artikel 
https://www.mikrocontroller.net/articles/String-Verarbeitung_in_C 
orientiert, bin aber leider nicht ins Ziel gekommen.
Hoffe auf Eure Hilfe

Tom

von Karl H. (kbuchegg)


Lesenswert?

Tom schrieb:

> Dieses Array ist definiert, da im Code befüllt wird (via serielle
> Schnittstelle). Soweit so gut! Nun möchte ich aber in dieses
> 10dimensionales Array Defaultwerte (z.B. Hans, Friedrich,Jo,..)
> einfüllen. Offensichtlich sind die Namen unterschiedlich lang,

Das macht nichts.
STrings sind in C so aufgebaut, dass immer klar ist, wo der String 
aufhört. Selbst dann, wenn der String kürzer ist als die Speicherfläche, 
in der er gespeichert ist.

> Wie weisse ich nun meine 10 Vornamen in den Array?
> Dachte so was in der Art
>
1
> stringUser[0] ="Hans"
2
> stringUser[30] ="Friedrich"
3
> stringUser[60] ="Jo"
4
> ...
5
>
>
> natürlich geht das so nicht, ich vermute dass ich in Richtung Pointer
> arbeiten muss.

Lass uns erst mal nur mit deinem 2D Array arbeiten
1
  strcpy( stringUser[0], "Hans" );
2
  strcpy( stringUser[1], "Friedrich" );
3
  strcpy( stringuser[2], "Jo" );

> Habe mich an dem Artikel
> https://www.mikrocontroller.net/articles/String-Verarbeitung_in_C
> orientiert, bin aber leider nicht ins Ziel gekommen.

Der ist ja eigentlich auch nur die Kurzform. Die Langform inklusive 
zahlreicher Übungsbeispiele sollte sich eigentlich in so ziemlich jedem 
richtigen C Buch finden.
Und so schwer ist das auch wieder nicht. Halte dich an die Maxime: 
arbeiten mit Strings bedeutet praktisch immer die Benutzung der str... 
Funktionen. Mit direkten Zuweisungen oder Vergleichen hast du da 
schlechte Karten.
Am Anfang benötigst du 3 Dinge:

* das Verständnis, dass die Speicherfläche (das Array) immer 
größer/gleich sein muss, als der darin zu speichernde String.
* Jeder String hat immer ein '\0' Byte hinten. Schreibst du selbst im 
Programmtext einen String, dann hängt der Compiler dieses Abschlussbyte 
für dich mit an.
* die 4 Funktionen strcpy(), strcat(), strcmp() und strlen()

Damit kommst du schon sehr weit.

Und PS: sieh dein 2D Array an als ein 1-dimensionales Array von weiteren 
1-dimensionalen Arrays. In letzteren wird jeweils 1 String gespeichert 
und die darüberliegende Zusammenfassung zu einem weiteren Array liefert 
dir dann ein Array von Strings.

: Bearbeitet durch User
von Thomas E. (picalic)


Lesenswert?

Servus,

eine Initialisierung des Arrays mit den Strings sollte auch so gehen:
1
 char stringUser[10][30] = {"Hans","Friedrich","Jo"...};

von Tom (Gast)


Lesenswert?

Hallo,

danke für die Hilfe.

Der Vorschlag von Thomas funktioniert soweit, allerdings der "sauberere" 
Weg von Karl Heinz wird in meinem Compiler mit einer Fehlermeldung 
quittiert - vielleicht liegt es an meinem Arduino 1.6.5 Compiler?
1
char stringUser[3][30]; // 
2
strcpy( stringUser[0], "Hans" );
Die Fehlermeldung
1
error: expected constructor, destructor, or type conversion before '(' token
2
expected constructor, destructor, or type conversion before '(' token

Irgend eine Idee?

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.