001
03.05.2007, 00:24 Uhr
0xdeadbeef
Gott (Operator)
|
Sieht so aus, als hättest du Verständnisprobleme mit der Speicherverwaltung. Such mal in der C/C++ FAQ nach einem Beitrag mit Titel "malloc & co".
Prinzipiell ist die gängigste Methode, sowas in C zu realisieren, einen Buffer samt Länge mit zu übergeben und da reinzuschreiben, also z.B.
C++: |
char *extract_spaces(char *dest, size_t n, char const *source) { size_t i, j;
for(i = 0, j = 0; i < n - 1 && source[j]; ++j) { if(!isspace(source[j])) dest[i++] = source[j]; }
dest[i] = '\0';
return dest; }
// ...
char s[] = "Hallo Welt", s2[100]; puts(extract_spaces(s2, 100, s);
|
Eine andere Möglichkeit ist, den Speicher dynamisch zu alloziieren, allerdings darfst du dann nicht vergessen, ihn wieder freizugeben:
C++: |
char *extract_spaces(char const *source) { char *dest = malloc(strlen(source) + 1);
for(i = 0, j = 0; source[j]; ++j) { if(!isspace(source[j])) dest[i++] = source[j]; }
dest[i] = '\0';
return dest; }
// ... char s[] = "Hallo Welt"; char *p = extract_spaces(s); puts(p); free(p);
|
Noch ne andere, aber weniger sinnvolle Möglichkeit ist, den Speicher statisch zu verwalten - so hast du das oben versucht, allerdings auf eine noch schlimmere Art und Weise, die den dynamischen namespace pollutet. Besser (aber immer noch schlecht):
C++: |
char *extract_spaces(char const *source) { static char dest[100];
size_t i, j;
for(i = 0, j = 0; i < 99 && source[j]; ++j) { if(!isspace(source[j])) dest[i++] = source[j]; }
dest[i] = '\0';
return dest; }
|
Das fliegt dir allerdings spätestens dann um die Ohren, wenn du mehrere Threads benutzt, und du musst aufpassen, dass du Kopien anlegst, wenn du den Kram irgendwo aufbewahren willst. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra |