(String-)Array als Rückgabewert einer Funktion?
-
Hallo
Mein Problem:
Ich möchte, dass eine Funktion eine Zeichenkette zurückgibt.Folgendes Beispiel ist falsch!
#include <stdio.h> #include <stdlib.h> #define BUF 5 char func(char *str) { str[BUF] = '\0'; /*Verändert den String (schneidet ihn ab!)*/ return str; } int main(void) { char string[] = "Hallo Welt"; /*Deklarieren und initialisieren einer Zeichenkette*/ string = func(string); printf("%s",string); /*Ausgabe von "Hallo", wenn BUF = 5*/ getchar(); return EXIT_SUCCESS; }
Eine Möglichkeit zur Lösung ist folgendes Beispiel...
#include <stdio.h> #include <stdlib.h> #define BUF 5 struct array /*Struktur*/ { char text[BUF]; } str_array; struct array func(char *str) { int i; str[BUF] = '\0'; /*Verändert den String (schneidet ihn ab!)*/ for (i=0; i < (sizeof(struct array)); i++) str_array.text[i] = str[i]; /*Zeichenweise in die Struktur schreiben*/ return str_array; /*Strukur (statt "str") an Funktionsaufruf zurückgeben*/ } int main(void) { char string[] = "Hallo Welt"; /*Deklarieren und initialisieren einer Zeichenkette*/ int q; str_array = func(string); /*String an Funktion "func" übergeben; Rückgabewert ist eine Struktur*/ for (q=0; q < (sizeof(struct array)); q++) string[q] = str_array.text[q]; /*Zeichenweise aus Struktur lesen und in "string" schreiben*/ printf("%s",string); /*Ausgabe von "Hallo", wenn BUF = 5*/ getchar(); return EXIT_SUCCESS; }
Aber eine andere Möglichkeit zur Lösung dieses Problems gibt es in C doch nicht oder?
-
Wird der zweite Code überhaupt kompiliert?
-
Dein erstes Beispiel funktioniert nicht, weil der zu modifizierende String in einem konstanten Bereich (read-only) liegt. Wenn Du vorher eine Kopie machst, wie z.B.:
char string[] = "Hallo Welt"; ... char string2[100]; strncpy(string2,string,sizeof(string2)-1); ...
Dann kannst Du string2 auch gemäß Deinem 1. Beispiel modifizieren.
Aber ich schätze, Du irrst nach einem ganz anderen Problem herum.
Ich mache das z.B. so:/******************************************************************************/ char *txt7bit(char *strp) /* char *strp; /* I: string */ /* ret: converted string */ /* changes all characters in string "str" to 7-bit-ascii */ /* and returns a copy with converted string */ { /* must not be more than NHSTR times used at parallel call */ /* e.g. within one parameter list */ register char *cp; register int ix; register char ch; #ifndef NHSTR #define NHSTR 20 /* no of help strings (for parallel calls) */ #endif #ifndef STRLGTH #define STRLGTH 512 #endif static char hstr[NHSTR][2*STRLGTH]; static int hix; if (*strp == (char) 0) return(strp); hix = (++hix) % NHSTR; cp = hstr[hix]; ix = sizeof(hstr[ix]); do /* ..while */ { ch = (*cp++ = *strp++ & 0x7F); } while ((ch != (char) 0) && (--ix > 0)); return(hstr[hix]); } /******************************************************************************/
Das Ding modifiziert eine übergebene Zeichenkette (oberstes Bit löschen) und gibt eine Kopie!!! zurück. Man kann die Funktion sogar mehrmals in einer Parameterliste, z.B. fprintf() aufrufen (hier maximal 20 mal als aktueller Parameter). Und man braucht dafür auch kein malloc() zu machen
Mir hilfst in den meisten Fällen. Und für die ewigen Besserwisser: Ja, die Begrenzung der Strings liegt bei 1023, das weiß ich auch
Ich nehme mal an, dass das Deiner eigentlichen Fragestellung ziemlich nahe kommt
@keksekekse: Ich schätze mal, dass ja. Aber es ist äußerst unüblich, eine Struktur (bzw. mehr als ein int) zurückzugeben, aber es geht!
-
jox schrieb:
Dein erstes Beispiel funktioniert nicht, weil der zu modifizierende String in einem konstanten Bereich (read-only) liegt. Wenn Du vorher eine Kopie machst, wie z.B.:
char string[] = "Hallo Welt"; ... char string2[100]; strncpy(string2,string,sizeof(string2)-1); ...
Dann kannst Du string2 auch gemäß Deinem 1. Beispiel modifizieren.
Ähm, nö.
#include <stdio.h> #include <stdlib.h> #define BUF 5 void func(char *str) { str[BUF] = '\0'; /*Verändert den String (schneidet ihn ab!)*/ } int main(void) { char string[] = "Hallo Welt"; /*Deklarieren und initialisieren einer Zeichenkette*/ func(string); printf("%s\n",string); /*Ausgabe von "Hallo", wenn BUF = 5*/ return EXIT_SUCCESS; }
und raus kommt "Hallo". Du verwechselst wohl "char string[] = "Hallo Welt";" mit "char *string = "Hallo Welt";".