Seltsames Verhalten von char (char != string dachte ich)
-
Belli schrieb:
Du übergibst an cin ein char - Array. Die Länge des Arrays kann cin nicht überprüfen.
Er übergibt einen (const) char Zeiger, und zwar an
istream& operator>> (istream& is, char* s).Belli schrieb:
Wenn Du da also nun Zeichen eingibst, liest cin die in einen Bereich ein, der gar nicht mehr Dir (Deinem Programm) gehört. Das KANN gutgehen, MUSS es aber nicht.
Es ist auf jeden Fall falsch!Ist falsch, ja.
Man kann es allerdings richtig bekommen. z.B. indem man vorher mitwidth()die maximale Länge setzt oder einfach gleichgetline(char* s, streamsize n)verwendet.
Finde ich zwar beides grausig, aber grundsätzlich ist es möglich. (Und wie überall mag es auch hier sinnvolle Anwendungefälle geben.)
-
Also habe ich das jetzt richtig verstanden das mein char Array quasi einfach durch das "befüllen" von cin vergrößert wird, obwohl ich keinen Speicherplatz reserviert habe?
Er übergibt einen (const) char Zeiger, und zwar an istream& operator>> (istream& is, char* s).
Un wie genau ist das mit dem Zeigern, ich habe doch einfach nur einen Datentypen von char aber ohne Pointer, wie kommt da jetzt der Zeiger in spiel?
Sonst schon mal danke!!!
Um das Problem jetzt zu lösen, muss ich also mit width() die Größe angeben und dann schneidet es den Rest weg.
Wenn ich das richtig verstanden habe werde ich mich da mal rein lesen.
-
Rarebit schrieb:
Also habe ich das jetzt richtig verstanden das mein char Array quasi einfach durch das "befüllen" von cin vergrößert wird, obwohl ich keinen Speicherplatz reserviert habe?
Nein. Es wird einfach darüber hinaus geschrieben. Und das ist nicht gut.
Er übergibt einen (const) char Zeiger, und zwar an istream& operator>> (istream& is, char* s).
Un wie genau ist das mit dem Zeigern, ich habe doch einfach nur einen Datentypen von char aber ohne Pointer, wie kommt da jetzt der Zeiger in spiel?
Ein Array wird in fast jeder Art von Ausdrücken (bis auf ~4-5 Ausnahmen) als ein Zeiger auf sein erstes Element interpretiert.
-
Rarebit schrieb:
Also habe ich das jetzt richtig verstanden das mein char Array quasi einfach durch das "befüllen" von cin vergrößert wird, obwohl ich keinen Speicherplatz reserviert habe?
Für eine ziemlich merkwürdige Definition von "vergrößern", ja. Es wird über das Ende des Arrays hinausgeschrieben. Wenn Du Pech hast, liegt da halt irgendwas anderes wichtiges.
Er übergibt einen (const) char Zeiger, und zwar an istream& operator>> (istream& is, char* s).
Un wie genau ist das mit dem Zeigern, ich habe doch einfach nur einen Datentypen von char aber ohne Pointer, wie kommt da jetzt der Zeiger in spiel?
Du kannst in C++ keine Arrays an Funktionen übergeben. Aus einem Array wird bei Übergabe an eine Funktion (und auch sonst fast immer, wenn man ein Array verwendet) ein Zeiger auf das erste Element.
-
Wie bist Du denn auf das schmale Brett gekommen, die gesamte Zeichenkette in ein Array einlesen zu wollen?
Bleib doch bitte bei dem, was Du bisher gelernt hast.
getchar()war ja offensichtlich dabei - benutz das!
-
Für eine ziemlich merkwürdige Definition von "vergrößern", ja.
Die Aussage ist falsch. Ein Array besitzt im Prinzip kein Speicherplatz, sondern ist einfach nur der Zeiger auf den Beginn einer Stelle im Speicher. Man kann diesen reservierten Speicher unmöglich vergrößern.
-
X schrieb:
Für eine ziemlich merkwürdige Definition von "vergrößern", ja.
Die Aussage ist falsch.
Ach! Deshalb schrieb ich ja "Für eine ziemlich merkwürdige Definition von "vergrößern"".
-
Kollege, egal wie "merkwürdig" man "vergrößern" auch definiert oder interpretiert, es wird für dieses Beispiel niemals zutreffen.
Es wird einfach darüber hinaus geschrieben.
Ist wesentlich zutreffender.
-
Das erklär einiges das ein Array keinen Speicherplatz hat sonder ein Zeiger ist, das hat man uns in der Uni aber als Datentyp erklärt...
Wie bist Du denn auf das schmale Brett gekommen, die gesamte Zeichenkette in ein Array einlesen zu wollen?
Bleib doch bitte bei dem, was Du bisher gelernt hast. getchar() war ja offensichtlich dabei - benutz das!
Wir haben in der Uni mit scanf() "gelernt", wir machen so nen Crashkurs und lernen da halt kaum Sachen aber die Aufgaben sollen wir halt machen...
Ich helfe meinen Kommillitonen halt aus, habe früher halt mal aus intresse ein Pong programmiert mit c++, wir leren aber nur c.
Getchar() kenne ich halt nur dadruch das man es nutzt damit die Konsole nicht zu geht.
Ich werde mich jetzt mal einlesen "in" getchar().Danke!!!
Das das
Array ein Pointer ist, ist schon gut zu wissen.
-
Rarebit schrieb:
Das das Array ein Pointer ist, ist schon gut zu wissen.
Es ist besser zu wissen, dass es nicht so ist.
Ein Array hat (nach der Definition) eine bestimmte Größe und eine Adresse.
Beide kannst du zur Laufzeit nicht mehr ändern.
Der Speicher besteht aus einem zusammenhängenden Block, der auch nur die Nutzdaten aufnimmt.
Über den Arraynamen kommst du an die Adresse vom ersten Element.Ein Pointer ist eine Variable, die eine Adresse aufnimmt.
Diese Adresse kannst du auch ändern.
Neben den Nutzdaten, auf die der Pointer verweist, braucht der Pointer selber auch Speicher, in der die Adresse steht.
-
Rarebit schrieb:
Das erklär einiges das ein Array keinen Speicherplatz hat sonder ein Zeiger ist, das hat man uns in der Uni aber als Datentyp erklärt...
Die Aussage von X ist auch Quatsch. Sofort vergessen! Ein Array ist kein Zeiger und ein Zeiger ist kein Array. Das anders zu sehen bringt einen schnell in Schwierigkeiten. Ein Array ist ein zusammengesetzter Datentyp, der einer Zusammenstellung gleichartiger Objekte entspricht, die man über einen Index ansprechen kann.
Wir haben in der Uni mit scanf() "gelernt", wir machen so nen Crashkurs und lernen da halt kaum Sachen aber die Aufgaben sollen wir halt machen...
Ich helfe meinen Kommillitonen halt aus, habe früher halt mal aus intresse ein Pong programmiert mit c++, wir leren aber nur c.Ist die Frage denn nun als C-Frage oder als C++-Frage zu verstehen? Mit scanf und C-Strings wäre dein Problem ganz einfach behebbar. Mit einem C++-String würde das Problem gar nicht erst auftauchen. Erst die Mischung aus C und C++ macht das Problem.
Und wie bereits mehrmals gesagt wurde, ist es ohnehin merkwürdig, hier nicht die Zeichen einzeln lesen zu wollen.
-
Ich Code in C++ und daher auch als C++ Frage aufzufassen.
Da ich immer mit C++ "gearbeitet" habe, möchte ich dies auch weiter so tun, in paar Wochen werden wir in der Uni auch darauf umsteigen.Strings haben wir noch nicht in der Vorlesung behandelt daher mit Arrays, aber ich weiß was ein String ist, wenn das raus das Chaos resultiert das ich C++ mit den Arrays zusammenwerfe, dann mache ich es einfach mit den Strings und fertig.

-
Die Aussage von X ist auch Quatsch. Sofort vergessen! Ein Array ist kein Zeiger und ein Zeiger ist kein Array. Das anders zu sehen bringt einen schnell in Schwierigkeiten. Ein Array ist ein zusammengesetzter Datentyp, der einer Zusammenstellung gleichartiger Objekte entspricht, die man über einen Index ansprechen kann.
Das mit den "Schwierigkeiten" empfinde ich als besonders großen Schwachsinn. Ein Array wird in C++ syntaktisch immer wie ein konstanter Zeiger behandelt. Ob du das Array als konstante Adresse auf den Anfang dieses Bereichs definierst, oder als konstanten Zeiger auf den Anfang des Bereichs ist absolut gleichwertig.
-
X schrieb:
Ein Array wird in C++ syntaktisch immer wie ein konstanter Zeiger behandelt. Ob du das Array als konstante Adresse auf den Anfang dieses Bereichs definierst, oder als konstanten Zeiger auf den Anfang des Bereichs ist absolut gleichwertig.
Nur mit einigen Ausnahmen. Der sizeof-Operator zum Beispiel. Über diese Sachen wird man dann irgendwann stolpern. Also besser das richtige lernen

-
X schrieb:
Die Aussage von X ist auch Quatsch. Sofort vergessen! Ein Array ist kein Zeiger und ein Zeiger ist kein Array. Das anders zu sehen bringt einen schnell in Schwierigkeiten. Ein Array ist ein zusammengesetzter Datentyp, der einer Zusammenstellung gleichartiger Objekte entspricht, die man über einen Index ansprechen kann.
Das mit den "Schwierigkeiten" empfinde ich als besonders großen Schwachsinn.
Sicher. Es gibt schließlich nur zehntausende Threads alleine in diesem Forum, die darauf beruhen, dass Leute Arrays für Pointer halten oder umgekehrt. Sind wohl alle dumm, außer dir, dass wir nie bemerkt haben, dass Arrays doch Pointer sind und es gar kein Problem gab! Selbst die Leute, die den Standard geschrieben haben, hätten sich viel Text sparen können, wenn sie das gewusst hätten.
Moment, was ist noch einmal Thema dieses Threads? Wieso hat der Threadersteller denn auf einmal Schwierigkeiten mit Arrays und Pointern, wenn das doch im Prinzip das gleiche ist?
-
Sicher. Es gibt schließlich nur zehntausende Threads alleine in diesem Forum, die darauf beruhen, dass Leute Arrays für Pointer halten oder umgekehrt. Sind wohl alle dumm, außer dir, dass wir nie bemerkt haben, dass Arrays doch Pointer sind und es gar kein Problem gab! Selbst die Leute, die den Standard geschrieben haben, hätten sich viel Text sparen können, wenn sie das gewusst hätten.
Stell dir mal vor, ich habe mir sogar die Zeit genommen einen Blick auf diese Threads zu werfen. Lieber SeppJ, wenn ich sage, ein Array kann auch als ein konstanter Zeiger behandelt werden, setzt das voraus, dass man Zeiger auch versteht. Das trifft leider auf keinen dieser Threadersteller zu und damit ist dein Argument absolut wirkungslos.
Nur mit einigen Ausnahmen. Der sizeof-Operator zum Beispiel.
Gut, dann definieren wir ein Array jetzt eben als konstante Adresse. Ein Anfänger hat jetzt sicherlich bessere Chancen zu verstehen, warum die Größe des Arrays nicht außerhalb der Funktion, in der es definiert wurde, ermitteln kann *nicht*.
Die angesprochenen "Schwierigkeiten" wird jeder Anfänger haben, ganz Gleich, ob ein Array nun ein konstanter Zeiger auf die Startadresse ist, oder eine konstante Adresse.
-
X schrieb:
Gut, dann definieren wir ein Array jetzt eben als konstante Adresse.
Im Gegensatz zu? Das beschreibt jede Art von Objekt.
-
Im Gegensatz zu? Das beschreibt jede Art von Objekt.
Jetzt kommt der interessante Teil. Prinzipiell würde die Definition dann etwa so lauten: Ein Array ist eine (konstante (gut, kann man sich wirklich sparen)) Adresse im Speicher, mit der Besonderheit, dass folgende Teile (bis Größe n) im Speicher mit einem Abstand von sizeof(Datentyp), reserviert werden.
Und jetzt mal ehrlich, wer soll daraus die Tücken durch z.B den sizeof Operator ableiten?
-
Du hast gerade auf ungenaue Art und Weise das wieder gegeben, was der Standard als ein Array definiert. Wo kommen nun deine Pointer ins Spiel? Zeiger sind keine Adressen, Adressen sind keine Zeiger. Der Unterschied ist wie der zwischen Verpackung und Inhalt.
-
Du hast gerade auf ungenaue Art und Weise das wieder gegeben, was der Standard als ein Array definiert.
Dann erkläre mir jetzt bitte, wieso ein Anfänger Schwierigkeiten bekommen sollte, wenn er ein Array als konstanten Zeiger und nicht als Adresse interpretiert?
Die sonderliche Behandlung durch den sizeof Operator ist nämlich ohne hin nicht ersichtlich.