Problem beim output von Zahlen mit \n
-
Ich habe etwas Erfahrung in Java und bin dabei, C++ zu lernen.
Dazu gucke ich mir einen Crashkurs auf Youtube an. Dort sind Programme verlinkt.
In dem Programm Dev-C++ habe ich diese geöffnet.
In einem habe ich mit \n herumprobiert. Dann ist mir aufgefallen, dass etwas komisch ist: die Ausgabe von Zahlen vor/nach einem \n.
Entweder wiederholen sich die vorherigen Zeilen oder eine von den zwei Zahlen wird nicht angezeigt.
kann mir jemand erklären, warum das so ist und wie ich das lösen kann (am besten, ohne die Zahlen in Gänsefüßchen zu setzen)?#include <iostream> using namespace std; //erspart std:: vor cout und weiteren Befehlen int main(void) { cout << "Erste Zeile." //kein ; Befehl geht also weiter << "Immer noch erste Zeile." << 7 +"\n" << 4 << endl << "Zweite Zeile.\n"; cin.get(); return 0; }
#include <iostream> using namespace std; //erspart std:: vor cout und weiteren Befehlen int main(void) { cout << "Erste Zeile." //kein ; Befehl geht also weiter << "Immer noch erste Zeile." << 7 << "\n" +4 << endl << "Zweite Zeile.\n"; cin.get(); return 0; }
-
Du addierst die 7 und das "\n". Letzteres ist ein
const char
Array. Somit bildest du die Summe aus einer Zahl und einer Adresse. Der Operator+
hängt nicht beliebige Strings zusammen, sondern er addiert hier zwei Zahlen. Nimm statt Plus hier auch<<
.Mit Plus probiere mal einen längeren String, z.B
"hallo du\n" + 3
) .
-
@wob Dann werden also beim addieren von strings und Zahlen Zeichen und \n's vom String abgezogen, oder? Und ich wollte auch noch fragen, ob dieses Programm ist, wie Du meinst.
#include <iostream> using namespace std; int main(void) { cout << 7 <<"\n" << 4 << endl << "Zweite Zeile.\n"; cin.get(); return 0; }
-
@MaxDerNeue sagte in Problem beim output von Zahlen mit \n:
Dann werden also beim addieren von strings und Zahlen Zeichen und \n's vom String abgezogen, oder?
Seltsame Frage ... man kann Strings und Zahlen einfach nicht addieren, genau genommen kann man nicht mal Strings addieren.
Strings kann man aneinanderreihen, man kann also zum Beispiel einen String an einen anderen hinten anhängen.
Für diese Aktion ist unter anderem in der Klasse std::string der Operator + überladen, um das einfach codieren zu können.
Das hat aber überhaupt nicht das Geringste mit einer Addition zu tun.
-
@MaxDerNeue sagte in Problem beim output von Zahlen mit \n:
@wob Dann werden also beim addieren von strings und Zahlen Zeichen und \n's vom String abgezogen, oder?
Nein. Erst einmal: "\n" ist kein (std::)string, sondern ein
const char[2]
- ein Array von 2char
s, dem Zeilenumbruch und dem 0-Zeichen für das Ende. So ein Array kann immer auch in einen Pointer auf das erste Element zerfallen, d.h. die Adresse des ersten Zeichen. In C und C++ kann man zu Adressen Zahlen hinzuaddieren oder abziehen. Man bewegt sich dann so viele Schritte vorwärts/rückwärts wie im Array angegeben.Wenn du z.B. folgendes anguckst:
#include <iostream> int main() { int x[] = {10, 20, 30}; std::cout << x + 0 << '\n'; std::cout << x + 1 << '\n'; std::cout << x + 2 << '\n'; std::cout << *(x + 0) << '\n'; std::cout << *(x + 1) << '\n'; std::cout << *(x + 2) << '\n'; }
Die ersten 3 Zeilen geben dir die Adresse des 0., des 1. und des 2. Elements im Array aus, die hinteren 3 Zeilen die dahinterstehenden Werte.
Bei chars das fast das gleiche:
#include <iostream> int main() { char x[] = {'a', 'b', 'c', '\0'}; std::cout << x + 0 << '\n'; std::cout << x + 1 << '\n'; std::cout << x + 2 << '\n'; std::cout << *(x + 0) << '\n'; std::cout << *(x + 1) << '\n'; std::cout << *(x + 2) << '\n'; }
Es gibt aber 2 wichtige Unterschiede:
- Wenn wir eine char-Adresse versuchen auszugeben, wird das als "Zeichenkette bis zum nächsten \0" interpretiert (und nicht die Adresse angezeigt).
- ...daher brauchen wir im Array ein '\0' am Ende.
Versuche also mal, die Ausgaben der beiden Programme nachzuvollziehen!
Und ich wollte auch noch fragen, ob dieses Programm ist, wie Du meinst.
#include <iostream> using namespace std; int main(void)
Das
void
in den Klammern brauchst du nur in C. In C++ kann es weg.{ cout << 7 <<"\n" << 4 << endl
std::endl
flusht auch (stellt sicher, dass sofort geschrieben wird). Du brauchst es in der Regel gar nicht, bzw nur, wenn du wirklich sicherstellen willst, dass geflusht wird. Ansonsten nimm einfach'\n'
.
-
@wob kannst du mir erklären, was ein flush ist. Ich habe im internet gelesen, dass ein flush so etwas wie ein
std::cin.sync()
ist. Und bei deinem ersten Programm komm bei mir
0x64ff10 0x64ff14 0x64ff18 10 20 30
raus. Das verstehe ich auch nicht so ganz. Es wäre nett, wenn du mir diese zwei Sachen erklären würdest.
Danke im Vorraus- Max
-
@MaxDerNeue Ein flush schreibt die Daten aus dem Zwischenspeicher (Buffer) auf das Ausgabegerät.
Das passiert normalerweise erst, wenn der Buffer voll ist.
Bei manchen Geräten auch mit dem Zeilenende ('\n') oder sogar nach jedem Zeichen.
Man kann das aber ändern.Es gibt auch die Funktion
fflush()
: https://en.cppreference.com/w/c/io/fflushDie Zahlen mit dem 0x davor sind die Adressen der Element vom Array.
cout
macht da einen Unterscheidet beichar
(bzw. Zeiger aufchar
).
Da dies meist einem C-String entspricht.
Beiint
hat man das nicht.