While(true) Endlosschleifen
-
*grübel* ich sehe immer noch nicht, was die String-Verarbeitung mit der <iostream> zu tun haben soll.
Ansonsten: Klar kannst du auch jedes Zeichen einzeln per fgetc() einlesen, überprüfen und in ein (zur Not mitwachsendes) char-Array füllen. Dann hast du natürlich auch kein Problem, dabei nebenher deren Anzahl fetszustellen.
(das ist vereinfacht die Art, wie ein std::string eingelesen wird)
Aber das zu machen, trägt imho nicht wirklich zur praktischen Anwendbarkeit bei - wenn ich programmiere, kümmere ich mich lieber um "höherwertige" Probleme und überlasse solche Kleinigkeiten wie die Eingabe oder Speicherverwaltung der Standard-Bibliothek.PS: Der operator>> für char* geht einfach davon aus, daß er "genug" Speicher hat, und schreibt alle ankommenden Zeichen in diesen Speicherbereich, gefolgt von einer \0 (die aus C bekannte Stringendemarke - wenn du die findest, hast du das Ende des Strings und damit auch seine Länge). Im Gegensatz zur std::string-Version reserviert er aber keinen neuen Speicher, wenn er keinen Platz mehr hat (noch schlimmer - er kann nicht einmal feststellen, ob der Platz reicht), sondern schreibt einfach weiter in Speicherbereiche, die dir nicht gehören.
-
Hmm, die String-Verarbeitung durch
std :: strlenoder
std :: string A; a.size();kennt der Compiler (DEvC++) nur wenn iostream vorhanden ist.
Aber mit fget() ist das ganze z.B. auch eine nicht schlechte Idee (brauch ich da aber nich wieder die <iostream> oder <stdio.h> für?)
Also ich habe das ganze jetzt wie folgt gelöst:... char string1[255]; char string2[255]; for (int i= 0;i<=255;i++) { string1[i] = '\0'; string2[i] = '\0'; } ...Muss nur noch irgendwie schauen, dass der User nicht zu viel eingibt bzw. ist ja ehr sein Problem wenn ich schreibe maximal 255Zeichen oder so.
Zu den "höheren Problemen":
klar benutzt man für schwere Problem die Standardbibliotheken um sich besser um diese Probleme etc. kümmern zu können. Doch versuche ich gerade sozusagen einen eignen Header zu schreiben, der entsprechende Funktionen die man mal brauchen könnte beinhaltet.Ich bin, im Gegensatz(nach deinen Post zu Urteilen) zu dir noch am Anfang meiner C++ "Karriere" und muss erst noch viele für mich klar machen und verstehen. Das tut man ja bekanntlich wenn man es selber macht oder sich intensiv damit beschäftigt.
-
Pille456 schrieb:
Zudem finde ich mal sollte schon so vorgehen wie die Programmiere damals, als die Rechner noch nicht so gut waren wie heute und nicht einfach alles Mögliche wegen der Bequemlichkeit einbinden.
Es programmiert doch nicht jeder für einen PC. <string> würde ich auch auf einem 1 MHz Rechner benutzen. Die standard lib ist ja nicht für den Einsatz auf einem PC entwickelt sondern auf beliebigen Plattformen.
-
Nur zur Klarstellung: strlen liegt in der <cstring> bzw. <string.h>, std::string in der <string> - es kann durchaus sein, daß diese beiden Header von <iostream> verwendet werden (aber offiziell enthält DER Header die Stream-Objekte cin, cout und Kollegen).
Und ganz ohne Fremd-Bibliotheken wirst du nicht auskommen (es sei denn du sprichst den Festplattencontroller direkt an - und das ist bestimmt nichts für einen C++ Einsteiger).
-
Okay...dann hab ich wohl einen anderen <iostream>-Header.
Ist der Normale von C++, mal sehen was ich da so finde o.O
Okay, die haben da folgende drei HEader eingebunden:
#include <bits/c++config.h> --> #include <bits/os_defines.h>
#include <ostream> --> #include <ios>;#include <bits/ostream.tcc>
#include <istream> --> #incldue <ios>; #include <limits>;# include <bits/istream.tcc>
"-->" bedeute,wie man sich eigentlich denken kann, in dem Header ist wiedrum der ein ander eingebunden usw...Warum hab ich denn keinen Standardheader, ist das der Standardheader, wenn nein wo bekomm ich einen her?^^
-
Hallo
Pille456 schrieb:
Zudem finde ich mal sollte schon so vorgehen wie die Programmiere damals, als die Rechner noch nicht so gut waren wie heute und nicht einfach alles Mögliche wegen der Bequemlichkeit einbinden.
Solche Aussagen kapiere ich einfach nicht. Du schnallst dich im Auto doch auch, obwohl es früher noch keine Gurte gab. Die Frage sollte doch viel eher lauten, warum sollte ich nicht Hilfsmittel benutzen, die mir das Programmieren erleichtern und mich vor allem auf die wesentlichen Dinge konzentrieren lassen.
chrische
-
Das einbinden von <string> verbraucht zwahr wohl mehr RAM als eine selbstgebaute Möglichkeit, die nur die von dir verwendeten Funktionen unterstützt, aber std::string ist weit optimiert, sodass du warscheinlich für deine Lösung deutlich mehr CPU brauchst
-
Pille456 schrieb:
Okay...dann hab ich wohl einen anderen <iostream>-Header.
Ist der Normale von C++, mal sehen was ich da so finde o.O<istream> und <ostream> sind normale Standardheader von C++ (für die Stream-Klassen), die ganzen <bit\...> Header dürften die Implementationsdetails der Klassen darstellen.
Ansonsten: Der Standard gibt nur vor, welche Header welche Definitionen enthalten sollten. Wenn du eine Funktion erreichen kannst, ohne den passenden Header zu nutzen, ist das zwar nett, aber i.a. nicht portabel (und ich kann mir durchaus vorstellen, daß die IO-Streams intern wieder mit char-Arrays oder strings arbeiten und dazu auch die Funktionen der Standard-Bibliothek verwenden).
-
Pille456 - nichts spricht dagegen, das du zum Lernen etwas selbst programmieren willst - nur so lernt man. Gute Tip's schaden aber nicht, sie helfen dir Zeit sparen und deinen Horizont zu erweitern!
@Pille456 schrieb:
Also ich habe das ganze jetzt wie folgt gelöst:char string1[255]; char string2[255]; for (int i= 0;i<=255;i++) { string1[i] = '\0'; string2[i] = '\0'; }Ich würde das obige z.B. so schreiben:
char string1[255] = {0,}; char string2[255] = {0,};keine for-Schleife nötig - alle 255 Chars auf 0.
-
Muha, okay danke das ist besser

Naja zu den Headerdateien: Ich denke das ist im gewissen Sinne schon eine Streitfrage, da jeder andere Vorlieben hat bzw. anders an Probleme hernageht.