Seltsames Verhalten von char (char != string dachte ich)
-
Guten Tag,
der Code ist ein Teil einer Aufgabe der Quersummenberechnung,
man soll ein Wort eingeben und alle ASCII Werte addieren.
Meine Idee war es ein char Array zu machen und dann jede Stelle zu betrachten und auszulese, allerdings muss ich einen Festen Array wählen (da ich noch keine Lösung dafür gefunden habe wie man bei Visual Studio dynamische Arrays macht).#include <iostream> using namespace std; char eingabe[1]; int main() { cin >> eingabe; getchar(); cout << sizeof(eingabe); cout << eingabe; getchar(); return 0; }Ich bin eigentlich der Überzeugung das man in einem Char nur ein Zeichen Speicher kann, wenn ich den char auch nicht zu enem Array mache speichert er auch nur das erste Zeichen, wenn man allerdings [1] an das char hängt speichert es alles sobald man es mit cout << eingabe ausgibt, mehr als es zeichen beinhalten kann.
Das ist für mich unverständlich...
Leider habe ich nix dazu gefunden.Ich würde gerne wissen warum das so ist.
Mfg Rarebit
-
Ich vermute mal, dein Problem wird sein, dass dein char-Array nicht null-terminiert ist. Wenn dir das solche Schwierigkeiten macht, kannst du aber auch einfach direkt einen std::string einlesen.
-
Du übergibst an cin ein char - Array. Die Länge des Arrays kann cin nicht überprüfen. 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!Wie schon gesagt wurde: Lies in einen std::string ein.
-
Das ist Problem ist das wir in der Vorlesung noch keinen String "kennengelernt" haben. Ich habe schon ab und zu mit C++ gemacht aber es soll halt mit einem Array gelöst werden.
Man soll ein Passwort vergleichen, daher benötige ich ein Char Array, um die einzelnen Zeichen zu vergleichen.
Daher ist es halt Problematisch wenn Zeichen weg fallen.
-
Dann musst du eben einzelne Zeichen einlesen und Abspeichern.
-
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?