Frage zu Char-Feldern Text usw.
-
es geht um untenstehenden Quelltext. Dieser Soll folgendes Machen den Text ersterText in ein neues Feld zweiterText schreiben und wo ein leerzeichen ist soll nochmals eins eingefügt werden .
Mein Problem ist folgendes ich versteh nicht warum an der Stelle (Hab sie unten nochmals markiert:
zweiterText[zwei++]=' ';
einfach davon ausgegangen wird das bei zweiterText[zwei] ein Leerzeichen vorhanden ist und somit gleich auf den nächsten Index gesprungen wird. also zweiterText[zwei++]. Ich dachte wenn ein Char-Feld erzeugt wird wie unten mit zweiterText[250] das wenn es noch nicht besetzt wurde dort irgendwelche zufallszeichen drinne stehen . und somit wenn man in den index vor zwei++ kein leerzeichen schreib das dort dann ein zufälliges Zeichen stehen kann. Oder sehe ich da was falsch=?=using namespace std;
#include <iostream>
#include <conio.h>int main()
{ char ersterText[]="Klausur in Programmieren 2 im SS 2009.";
char zweiterText[250];
int eins=0,zwei=0;while (ersterText[eins]!='\0')
{ zweiterText[zwei]=ersterText[eins];
eins++;zwei++;
if (ersterText[eins]==' ')
zweiterText[zwei++]=' '; // -> Unklar
}zweiterText[zwei]='\0';
cout << ersterText<<endl;
cout << zweiterText;getch();
}
-
Warum sollte dort ein zufälliges Zeichen entstehen ? Dort ist einfach undefinierter Speicher.
Oder habe ich deinen Text nun falsch verstanden ?P.S.
Gewöhn dir Cpp Tags an und bitte arbeite an deiner Grammatik, sowie an deiner Rechtschreibung.
-
Danke erstmal für deine Antwort!
Sorry für die Rechtschreibung. habs schnell getippt.Achso heißt das dann wenn ich dem undefinierten Speicher was z.B. zweiterText[7] wäre nichts zuweise steht dort ein Leerzeichen?
Hätte da noch eine Frage:
Wenn ich ein Char-Feld für 20 Buchstaben anlegen will, frag ich mich warum man dann ein Char-Feld der Länge 21 anlegt?
Das Char Feld fängt doch bei 0 an und geht dann bis 19 (Was den 20 Buchstaben entspr.) und dann noch 1 für das Null-Byte.
Somit wäre ich bei der Länge 20. Braucht das Null-Byte mehr als 1 Index??
-
using namespace std; #include <iostream> #include <conio.h> int main() { char ersterText[]="Klausur in Programmieren 2 im SS 2009."; char zweiterText[250]; int eins=0, zwei=0; while (ersterText[eins]!='\0') { zweiterText[zwei]=ersterText[eins]; eins++; zwei++; if (ersterText[eins]==' ') zweiterText[zwei++]=' '; // -> Unklar } zweiterText[zwei]='\0'; cout << ersterText<<endl; cout << zweiterText; getch(); }Es ist egal, was vorher in zeiterText[zwei] stand, weil es mit einem Leerzeichen überschrieben wird.
Du brauchst 1 Zeichen mehr als du Buchstaben verwenden willst aus dem einfachen Grund weil noch ein abschließenden '\0' hinzugefügt werden muss.
D.h. "Hallo" wird zur Zeichenkombination 'H' 'a' 'l' 'l' 'o' '\0'
Deine Abbruchbedingung in while prüft z.B. genau auf dieses '\0'.
-
aber die if bedingung sagt doch wenn beim ersten text ein leerzeichen entdeckt wird erhöhe zwei++ also eins weiter und dort schreibt er dann das leerzeichen rein. aber genau an dem Index wo er eins bei erster text gefunden hat schreib er im zweiten text nix rein=?
Und zu dem Char feld , habe da eine Aufgabe gefunden man will 20 Buchstaben in das Feld reinspeichern , in der Lösung macht er es aber mit der Laenge 21. Müssten doch eigentlich lg 20 sein oder?
-
ein beispiel wäre das hier: (Sorry weiss leider nicht wie man das direkt vom Fenster aus reinkopieren kann. )
Ich weisse dem Char Feld z.B. diese 6 Buchstaben zu. von der Länge her müsste es doch reichen 6 zeichen und ein Nullbyte. Da ja der Index bei 0 Anfängt? Aber der Compiler sagt das es Zu lang ist für das Feld. das ist mir unklar.// Testumgebung
//using namespace std;
#include <iostream>
#include <conio.h>int main()
{ char x[6]="Halloo";getch();
}
-
Bei einem Postfix-Inkrement wie z.B. zwei++ wird zwei erst nach dem Ausdruck erhöht.
x1 = 5;
x2 = 5++; // x2 bekommt hier den Wert 5
x3 = ++5; // x3 würde den Wert 6 bekommen weil es hier das Präfixinkrement istmatrix1900 schrieb:
Und zu dem Char feld , habe da eine Aufgabe gefunden man will 20 Buchstaben in das Feld reinspeichern , in der Lösung macht er es aber mit der Laenge 21. Müssten doch eigentlich lg 20 sein oder?
Wenn du wirklich nur char-Zeichen abspeichern willst reichen natürlich 20 Felder. Wenn du die diese char-Zeichen aber als Nullterminierte Zeichenkette verwenden willst, z.B. bei einer Ausgabe mit cout, dann brauchst du noch Platz für das '\0'-Zeichen sonst wissen die Funktionen, die das char-Array als Zeichenkette bearbeiten sollen, nicht wo die Zeichenkette eigentlich endet.
Wenn du
char x[6]
nimmst läuft der Index von 0 bis 5, also nicht von 0 bis 6. Es werden 6 Felder angelegt und die sind zu wenig für die 6 Zeichen + Nullzeichen
-
ok was macht er aber konkret in dem fall
zweiterText[zwei++]=' '; er geht erst angenommen zwei wäre 5 , erst in index 5 und macht dort das leerzeichen wenn der damit fertig ist erhöht er um eins und geht wieder auf den anfang der while schleife? Wie macht der das dann damit nach dem ersten Leerzeichen nochmal eins angefügt wird. das ist nämlich die aufgabe des Programms was diersr Quelltext auch macht .
das ganze ist mir noch etwas unklar. sorry.
-
Angenommen es wurde gerade das Zeichen r aus "Klausur" kopiert, d.h. eins=6 und zwei=6. zweiterText enthält also bisher genau die Zeichen "Klausur". Was in zweiterText hinter dem r, also an Position 7 steht ist noch unklar.
Dann werden durch
eins++;
zwei++;
eins und zwei auf 7 erhöht.Die if Bedingung prüft nun ob in ersterText an Position 7 ein Leerzeichen steht und wird fündig. Durch
zweiterText[zwei++]=' ';
wird dann in zweiterText ein Leerzeichen an Position 7 geschrieben und anschließend zwei inkrementiert (Postfix-Inkrement)
D.h. beim nächsten while-Durchlauf ist eins=7 und zwei=8, und das Leerzeichen aus ersterText Position 7 wird nochmal auf die Position 8 von zweiterText kopiert.
Mit diesem Versatz geht es dann weiter mit den anderen Zeichen.
-
ach jetzt hab ich es verstanden. der trick dabei ist das ich einfach auf der im erstentext vorhandenen stelle im zweiten beim gleichen index eins reinschreib. erhöhe danach den index vom 2ten und schreibe dann den wert vom index vom ersten wo eh schon ein leerzeichen ist in die um 1 verschobene stelle.
jap jetzt hab ich s. danke vielmals.