Frage von Cambaru, 52

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

Hey ho, Ich habe das Problem aus stringcutter() stringparts zu "returnen" und kenne auch keinen Weg wie das gehen könnte... Vielleicht könnt ihr mir ja weiterhelfen! Gruss Cambaru

char stringcutter() {
int i = 0;
char stringparts[10][20] = { "" }; //MAX ZEHN ZEICHEN FÜR 1 VON 20 STRINGS 
char stringwhole[200] = "";
char trennzeichen[] = " ";
char *wort;
fgets(stringwhole, 100, stdin);

wort = strtok(stringwhole, trennzeichen);
while (wort != NULL) {
    strcpy(stringparts[i], wort);
    wort = strtok(NULL, trennzeichen);
    i++;
}
return **stringparts;
}
int main(){
    char stringparts[10][20]={""};
    **stringparts = stringcutter();

system("pause");

}

Expertenantwort
von TeeTier, Community-Experte für programmieren, 16

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ß! :)

Kommentar von Cambaru ,

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?

Antwort
von DoTheBounce, 30

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
von ArchEnema, 24

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.

Kommentar von Cambaru ,

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

Kommentar von ArchEnema ,

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$

Keine passende Antwort gefunden?

Fragen Sie die Community