*char[]???
-
Hallo!
Ich habe ein Problem, wie kann ich einem Zeiger auf ein char-Array zeichen zuweisen?
Ich habe folgendes versucht, aber es funktioniert nicht:
const char MAX_WORD=4; const char MAX_LINE=256; char eText[MAX_LINE]; char **helpText; while(cin.getline(eText, MAX_LINE, '\n') && i<MAX_WORD) { helpText[i++] = eText; };
Das funktioniert nicht. helpText enthält immer nur den zuletzt eingegebenen String.
Also wie kann ich Mehrere Sätze in ein Zeiger auf ein char-Array einlesen?
Zweite Frage wäre zudem wie ich für ein Zeiger auf ein char-Array mit new Speicher anforder, da folgendes nicht funktioniert:
char **mArray = new char[5][5];
Code-Hacker
-
helpText ist uninitialisiert, was glaubst du wo helpText[i] hinzeigt? Nehmen wir an es wär initialisiert ... dann liest du immer wieder in das gleiche Array (eText) etwas ein und weist einem Element von helpText die Adresse dieses Arrays zu. Klar, dass am Ende alle Elemente gleich sind.
Um das Problem lösen zu können müsste man mehr wissen ... welche Speicherklasse soll das ganze denn haben? ein char[MAX_WORD][MAX_LINE] scheints ja nicht zu tun ...
Code-Hacker schrieb:
Zweite Frage wäre zudem wie ich für ein Zeiger auf ein char-Array mit new Speicher anforder, da folgendes nicht funktioniert:
char **mArray = new char[5][5];
Hm ohne das jetzt ausprobiert zu haben:
char (*mArray)[5] = new char[5][5];
wenn das nicht tut, machs mit nem typedef auf char[5]. Dynamischer gehts ohne Klassen nicht, alle bis auf eine (die äußere) Arraygrenze müssen fest sein.
-
Ich nehme an, helpText war so initialisiert: char* helpText[ANZ_TEXTE];
Texte werden durch den einfachen Zuweisungsoperator NICHT kopiert!!! Besser:
helpText[i++] = strdup(eText);
Am Schluß dann nicht vergessen, mit free() den Speicher wieder frei zu geben!strdup() und free() sind übrigens C-Stil, in C++ gibt es höchstwahrscheinlich noch ausgefeiltere Möglicheiten. Aber so ist es sicher am einfachsten und schnellsten.
-
In C++ könnte man z.B. vector<vector<char> > nehmen ?!
-
Knuddlbaer schrieb:
In C++ könnte man z.B. vector<vector<char> > nehmen ?!
bzw. vector<string>
-
Hi!
Erstmal danke für die Hilfe. Es muss mit einem Zeiger auf ein char-Array sein.
Ich habe das jetzt so gemacht:
char eText[MAX_LINE]; char (*helpText)[MAX_LINE] = new char[5][MAX_LINE]; char sText[MAX_LINE]; cout << "Eingabe:"<<endl; // Liest MAX_LINE Zeichen und MAX_WORD Zeilen while(cin.getline(eText, MAX_LINE) && i<MAX_WORD) { strcpy(helpText[i++], eText); };
Funktioniert soweit auch ganz gut. Also er meckert nicht mehr rum! Anderes Problem habe ich beim Suchen. Ich gebe einen Suchtext ein und suche mit folgender Schleife:
cout << "\nAusgabe:" << endl; for(int j=0; j<MAX_WORD; ++j) if(strstr(helpText[j], sText)!=0) cout << j+1 << ": " << helpText[j] << endl;
Wenn in helpText z.B.:
Test 1
Test 2
Test 3
Test 4
drin steht und ich nach Test suche, dann ist die Ausgabe folgende:
2: Test 1
3: Test 2
4: Test 3Mit strcpy müsste es ja gehen. Schließlich kopiert strcpy den Text von eText nach helpText[i] mitsamt der Endekennung. Mich wundert jetzt das er bei 2 beginnnt und nicht bei 1 mit dem ersten Fund. Normalerweise müsste er ja bei 1 beginnen und dort "Test 1" finden.
Code-Hacker
-
Hallo!
Ich habe den Fehler gefunden!!! Danke für eure Hilfe!
Code-Hacker
-
Hm, wieso muss es dann ein Zeiger auf char sein?
-
Hi!
@Mis2com:
Da das eine Aufgabe von einem Kumpel so fordert, ansonsten hätte ich mich schon anderen Mitteln bedient nur die Aufgabe fordert ein Array und es müssen mehrere Sätze eingegeben werden bzw. mehrere Zeilen, dabei kann der User (mehr oder weniger) bestimmen wie lang die Zeile sein soll. Jede Zeile soll danach durchsucht werden nach einem Wort, später auch Zeilenübergreifend und dann sollen die Zeilennummer und die Zeile mit dem Wort zurückgegeben werden.Eine frage hätte ich noch. Ich habe die Schleife oben so geädert das die Eingabe in der Schleife und nicht mehr in der Bedingung ist, aber die Schleife wird einmal durchlaufen und danach kann man erst das erste mal seine Eingabe machen, woran liegt das?
Schleife würde ungefähr so aussehen:while(i<n) { cin.getline(eText, 256, '\n'); strcpy...; };
Code-Hacker