Seltsames Verhalten von char (char != string dachte ich)



  • 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.


  • Mod

    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.


  • Mod

    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 😉


  • Mod

    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.


  • Mod

    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?


  • Mod

    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.


  • Mod

    X schrieb:

    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.

    Bloß weil ein Anfänger es sowieso nicht richtig weiß, sollte man ihm nicht was falsches beibringen. Eigentlich gibt es fast nie einen Grund, jemandem was falsches bei zu bringen, die einzige Ausnahme die ich mir vorstellen kann ist, dass man dadurch einen Sachverhalt erheblich vereinfacht und dann später richtig stellen kann.

    Stellen wir fest:
    -Anfänger haben Schwierigkeiten mit Arrays
    -Anfänger haben Schwierigkeiten mit Pointern
    -Arrays sind keine Pointer, Pointer sind keine Arrays.

    Wieso sollte man einem Anfänger beibringen, dass Arrays Pointer wären?

    Zumal wir wissen, dass Anfänger Probleme bekommen, wenn sie Arrays wie Pointer behandeln oder umgekehrt. Wir haben abertausende Threads wo jemand sizeof auf Zeiger anwendet; Probleme mit dem Typ des Adressoperators bekommt; oder sich fragt, wieso man einem Zeiger auf Zeiger kein 2D-Array zuweisen kann. Denn die vereinfachte Sichtweise Pointer = Arrays bricht eben bei der kleinsten Herausforderung zusammen. Im Gegenzug hilft sie nicht einmal bei anderen Gelegenheiten, denn so lange man nichts Herausforderndes macht, hat man sowieso keine Probleme mit Pointern oder Arrays.


Anmelden zum Antworten