C - Wie ein 2D String-Array aus einer Funktion "returnen"?

...komplette Frage anzeigen

3 Antworten

Auch wenn ich jetzt nicht direkt deine Frage beantworte, aber ich möchte dir einen kleinen (ausdrücklich NICHT böse gemeinten) Rat geben:

Man merkt an deinem Code, dass du viele Grundlagen noch nicht verinnerlicht hast und du hast so viele (katastrophale) Fehler drin, dass ich dir auch nicht damit helfen würde, auf jeden einzelnen davon einzugehen.

Vielleicht solltest du C von Anfang an in aller Ruhe lernen, denn ohne die nötigen Grundlagen wirst du später nicht weiter kommen. C ist jetzt auch nicht soooo kompliziert, dass man das nicht schaffen würde, also viel Erfolg!

Fang lieber erst mal klein an, und steigere dich langsam! Dann lösen sich die Probleme aus deiner Frage nämlich von allein.

Viel Spaß! :)

Antwort bewerten Vielen Dank für Deine Bewertung
Cambaru 22.04.2016, 19:22

Die Sache ist, dass ich mir in den Kopf gesetzt habe eine "Multiple Eingabe" zu machen .... Naja einmal in meinem Kopf möchte das auch in Code verfasst werden...

Kannst du mir vielleicht trotzdem eine korrigierte Version geben oder mir den weg dahin zeigen?

0

Du hast 2 Möglichkeiten:

Entweder, du holst dir in der Funktion dynamisch neuen Speicher (malloc) und gibst den Zeiger darauf zurück. Problem dabei ist natürlich, dass der Nutzer der Funktion dann diesen Speicher auch wieder aufräumen muss.

Alternativ (und in meinen Augen für dieses Problem besser geeignet) kannst du auch direkt einen Zeiger auf den von dir zur Verfügung gestellten Speicherbereich als Argument übergeben. Die Funktion selbst schreibt dann alles in den Bereich rein.

Antwort bewerten Vielen Dank für Deine Bewertung

Nachdem du ja in main() eh schon Speicher reserviert hast (stringparts), kannst du einen Zeiger darauf als Argument an stringcutter übergeben.

void stringcutter(char *stringparts[][]) { ... }

Und dann in main() so aufrufen:

stringcutter(&stringparts);

Dann aber ist in stringcutter() zu beachten, dass stringparts jetzt eine (weitere) Dereferenzierung braucht:

 strcpy((*stringparts)[i], wort);

Hoffe die Syntax stimmt so. Mein C ist etwas eingerostet. ;-))

Deine Initialisierung von stringparts ist übrigens ein bisschen fragwürdig. Wirft zwar keinen Fehler, tut aber nicht was du vmtl. denkst dass es tut (ich bin mir selber nicht ganz sicher, was es tut). :D Ich würde mit memset() einfach alles nullen.

Antwort bewerten Vielen Dank für Deine Bewertung
Cambaru 22.04.2016, 19:33

Ich habs geändert... Allerdings geht es trotzdem nicht :/

0
ArchEnema 22.04.2016, 21:37
@Cambaru

Naja, da waren noch ein "paar" andere Anpassungen nötig. Hier mal meine Lösung:

#include <stdio.h>
#include <string.h>

typedef char stringparts_t[10][20];

int stringcutter(stringparts_t *stringparts) {

char *trennzeichen = " ";

char stringwhole[200];
fgets(stringwhole, 200, stdin);

char *wort = strtok(stringwhole, trennzeichen);

int i;
for (i = 0; i < 10 && wort != NULL; ++i) {
strncpy((*stringparts)[i], wort, 19); // Länge begrenzen und terminierende \0 (aus memset()) nicht überschreiben!
wort = strtok(NULL, trennzeichen);
}

return i;
}

int main(int argc, char *argv[]) {

stringparts_t stringparts;
memset(&stringparts, 0, sizeof(stringparts));

int n = stringcutter(&stringparts);

printf("%i Wörter gelesen.\n", n);

int i;
for (i = 0; i < n; ++i) {
printf("%i: '%s'\n", i, &stringparts[i][0]);
}
}

Und auch da sind sicher noch ein paar Probleme drin... Test:

bash-4.2$ ./main  
aesfaewfraefirhaebngrueihtgreigb 2 skgjhnawrefauiwhgfaueirgeuigrhneuigi 3
4 Wörter gelesen.
0: 'aesfaewfraefirhaebn'
1: '2'
2: 'skgjhnawrefauiwhgfa'
3: '3
'
bash-4.2$
1

Was möchtest Du wissen?