Und was war jetzt das Problem mit insert? Weil einfügen tust du mit deiner Lösung nichts.
Und was war jetzt das Problem mit insert? Weil einfügen tust du mit deiner Lösung nichts.
Sieht doch gut aus. Ich finde deine <vector<vector>>-Konstruktion interessant. Brauchst du tatsächlich einen Vektor beliebiger Länge, gefüllt mit Vektoren beliebiger Länge?
Hi,
ich stehe irgendwie total aufm Schlauch. Wir sollen ein Programm schreiben, dass einen String einliest, auf den Buchstaben char c überprüft und den restlichen Teil des Strings im Doppelpointer **rest an die Stelle *rest speichern.
Ich hab jetzt über eine Stunde blöd rumprobiert, aber das Programm stürzt jedes mal ab... Habs auch schon ohne den Doppelpointer probiert, aber irgendwie bekomm ich das einfach nicht hin
Kann mir irgendjemand sagen, was falsch ist?
Edit: char**rest wird natürlich deklariertCode:#include <stdio.h> #include <stdlib.h> int split(char * w, char c, char **rest); int main(void){ char c = 'a'; char *w = "Hallo"; char **rest; int i; printf("*w: %s\n", w); i = split(w, c, rest); printf("%i\n", i); if(i == 1){ printf("**rest: %s\n", rest); } return 0; } int split(char * w, char c, char **rest) { int i = 0; while (w[i] != c && w[i] != '\0') ++i; if (w[i] == c) { w[i] = '\0'; if(rest != NULL){ rest = &w[i + 1]; } return 1; } else return 0; }
Geändert von Gobl (15. Januar 2018 um 18:53 Uhr)
Ich befürchte Hilfe zur Selbsthilfe bringt nichts mehr
Hab jetzt die zwei Warnungen mit aufgenommen und es wurde nur angemerkt, dass in printf("**rest: %s\n", rest); rest falsch ist und **rest uninitialisiert verwendet wird. Erstes hab ich ausgebessert, fürs zweite finde ich schonmal keine passende Lösung. Alles was ich finde sind immer nur Pointer auf bestehende Matrizen, aber hier soll ja gar nichts wirklich initialisiert werden
Du versucht sie pointer adresse zu printen und und nicht den String, da rest ein Doppelpointer ist.
Meine Liste:
- K
- T
- V
printf("**rest: %s\n", *rest); Hatte ich verbessert, wie geschrieben. Das war das einzige das ich anpassen konnte.
Der Fehler muss aber schon in der split-Funktion auftreten, das die erste print-Anweisung noch ausgegeben werden kann, aber dann das Programm abstürzt, wenn split() aufgerufen wird
&w[i+1] ergibt als Ergebnis die Adresse einer char-Variablen.
Wie kriegt du das Programm überhaupt zum Laufen ? Mein Compiler weigert sich zu kompilieren wegen Zeile 30
StorysZitat von Isaac Newton; in einem Brief an Robert Hooke
Civ 4: Weg in den Olymp
Civ 4 PBEM 474 Das Steigen und Fallen der Kurse
Aber ich möchte ja die Adresse speichern? Ich sehe nicht was falsch ist. Vielleicht ist es total offensichtlich, aber so wie ich mich da mittlerweile reingesteigert habe, werd ich das nicht mehr sehen. Kann denn jemand mir bitte sagen, was dort zu verbessern ist?
@Strat: Keine Ahnung, es läuft einfach
Du versuchst einem pointer auf einen char pointer die Adresse des chars zu geben. w[i+1] dereferenziert das array und dann referenzierst du ihn nur einmal weswegen rest da ein normaler char pointer sein müsste und nicht ein pointer auf einen char pointer.
Meine Liste:
- K
- T
- V
Das ist aber diese tolle Aufgabenstellung hier^^ Wir müssen einen Doppelzeiger verwenden
Edit: Hier mal die Aufgabenstellung:
a) (**, 4 Minuten)
Betrachten Sie die folgende Funktion aus Kapitel 13 der Vorlesung:
char * split(char * w, char c) {
int i = 0;
while (w[i] != c && w[i] != '\0')
++i;
if (w[i] == c) {
w[i] = '\0';
return &w[i + 1];
}
else
return NULL;
}
Implementieren Sie eine abgeanderte Version dieser Funktion mit dem Prototypen
int split(char *w, char c, char **rest), die
1 zuruckgibt, falls c in w vorkommt,
0 zuruckgibt, falls c in w nicht vorkommt,
die Adresse des abgeteilten zweiten Teils von w nicht zuruckgibt, sondern an der Stelle
*rest speichert, falls fur rest nicht NULL ubergeben wurde.
Geändert von Gobl (15. Januar 2018 um 20:11 Uhr)
Oben fehlt bei dir der Stern vor rest (= &w[i+1] oder auch w+(i+1))
Edit: Im printf weiter oben ebenfalls.
Edit2: Wobei in main noch mehr schief gegangen ist, wie Quietsch mittlerweile schrieb. Das dortige rest darf so nicht übergeben werden, sondern die Adresse auf seine Position.
Also statt char **rest; ... ; split(..., rest); muss es char *foobar; ...; split(..., &foobar); sein.
Geändert von Ramkhamhaeng (15. Januar 2018 um 20:26 Uhr)
Code:#include <stdio.h> #include <stdlib.h> int split(char * w, char c, char **rest); int main(void){ char c = 'a'; char *w = "Hallo"; char *rest; int i; printf("*w: %s\n", w); i = split(w, c, &rest); printf("%i\n", i); if (i == 1){ printf("**rest: %s\n", rest); } return 0; } int split(char * w, char c, char **rest) { int i = 0; while (w[i] != c && w[i] != '\0') ++i; if (w[i] == c) { if (rest != NULL){ *rest = &w[i + 1]; } return 1; } else return 0; }