Stil ok?
-
Bin C++ Neuling und habe aus meinem Übungsbuch die erste (etwas) komplexere Aufgabe gelöst. Als ich dann in der Lösung nachgeguckt hab, hab ich mich doch ziemlich erschrocken weil der Autor so ziemlich alles anders gemacht hatte als ich. Fängt bei den Variablennamen an(er hat viel längere mit _ im Gegensatz zu mir genommen), geht über die Zählschleife weiter(wo er zwei Zählvariablen verwendet, eine davon in der Schleife definiert) bis hin zu den Sachen die den Funktionen übergeben werden. Quelletext ist meiner etwas umfangreicher als seiner.
#include <iostream.h> #include <string.h> char eingabe(char *); void ausgabe(char *); int main(){ char text[20]; eingabe(text); ausgabe(text); return 0; } char eingabe(char * t){ cout << "Text eingeben: "; cin >> t; return reinterpret_cast<char>(t); } void ausgabe(char * t){ cout << "Text in umgekehrter Reinfolge: "; unsigned int i; for(i=0;i!=strlen(t);i++) cout << t[strlen(t)-i-1]; cout << "\n"; }
Darum meine Frage an euch, seht ihr irgendwelche Stilblüten/Unsinn oder ist dieser Quelltext von mir vom Stil her ok?
-
#include <iostream.h>//veraltet. heißt heute <iostream> #include <string.h>//er sollte erstmal <string> nehmen char eingabe(char *);//veralteter stil, die funktionen über der main //zu deklarieren und unterhalb zu definieren. das war in c toll, //in c++ schlecht, weil in c++ extrem wenige funktionen so rumstehen. void ausgabe(char *);//dito int main(){//ok char text[20];//string wäre angebrachter erstmal eingabe(text);//ok ausgabe(text);//ok return 0;//ok }//ok char eingabe(char * t){//char* t ist üblicher. was soll der returnwert? const fehlt cout << "Text eingeben: ";//eingabe? cin >> t;//keine längenbeschränkung, macht buffer overflow return reinterpret_cast<char>(t);//den zeiger nach char? welch ein //hohn. }//ok void ausgabe(char * t){//char* t ist üblicher cout << "Text in umgekehrter Reinfolge: ";//ok unsigned int i;//ganz alt for(i=0;i!=strlen(t);i++)//dito //soll heisen: for(size_t i=0;i!=strlen(t);++i) cout << t[strlen(t)-i-1];//langsam nerven die strlen-aufrufe cout << "\n";//ok }//ok
evtl würde man das heute lieber so schreiben, aber ich kenn mich da nicht so aus:
#include <iostream> #include <string> #include <algorithm> using namespace std; int main(){ cout << "Text eingeben: "; string text; getline(cin,text); reverse(text.begin(),text.end()); cout << "Text in umgekehrter Reinfolge: " << text << '\n'; return 0; }
-
volkard schrieb:
ich kenn mich da nicht so aus:
LOL?
volkard schrieb:
... cout << "Text in umgekehrter Reinfolge: " << text << '\n'; ...
Wieso nicht:
... cout << "Text in umgekehrter Reinfolge: " << text << endl; ...
?
-
ChockoCookie schrieb:
Wieso nicht:
... cout << "Text in umgekehrter Reinfolge: " << text << endl; ...
?
weil endl flusht. nu isses aber so, daß cout schon von alleine flusht nach jeder ausgabe. ist also doppelt gemoppelt und man sollte sich endl bei cout eigentlich wegen nutzlosigkeit abgewöhnen.
außerdem entgeht man der gefahr, sich endl statt '\n' so fest anzugewöhnen, daß man bei files und sockets ach immer endl statt '\n' schrebt, wo es dann richtig teiuer werden würde.
-
nu isses aber so, daß cout schon von alleine flusht nach jeder ausgabe.
Soweit ich weiß nur wenn der Stream zerstoert wird oder wenn eine Eingabe mit cin gemacht wird.
-
volkard schrieb:
ChockoCookie schrieb:
Wieso nicht:
... cout << "Text in umgekehrter Reinfolge: " << text << endl; ...
?
weil endl flusht. nu isses aber so, daß cout schon von alleine flusht nach jeder ausgabe. ist also doppelt gemoppelt und man sollte sich endl bei cout eigentlich wegen nutzlosigkeit abgewöhnen.
außerdem entgeht man der gefahr, sich endl statt '\n' so fest anzugewöhnen, daß man bei files und sockets ach immer endl statt '\n' schrebt, wo es dann richtig teiuer werden würde.Wenn mich mein Debugger(VC6) micht belügt, dann wird bei mir zumindest, ohne endl
KEIN basic_ostream<...>.flush() direkt durch cout aufgerufen.
Ich hab auch im Standard nichts gefunden das besagt das es so sein müsste.
-
o!ze schrieb:
nu isses aber so, daß cout schon von alleine flusht nach jeder ausgabe.
Soweit ich weiß nur wenn der Stream zerstoert wird oder wenn eine Eingabe mit cin gemacht wird.
hab ich aber neulich in nbem forum gelesen. naja, ein blick in den standard bestätigt es. du hast recht. kann nix finden, was cout und unitflush zusammenbringt.
ok. immer endl ist aber auch dann nicht gut. vor eingaben und bei programmende flusht es ja selber.
-
Noob42 schrieb:
cout << t[strlen(t)-i-1];
Wow, der alte Schlemiel würde sich freuen. Na hoffentlich hast du einen guten Compiler.
-
Redhead schrieb:
Wenn mich mein Debugger(VC6) micht belügt, dann wird bei mir zumindest, ohne endl KEIN basic_ostream<...>.flush() direkt durch cout aufgerufen.
Ich hab auch im Standard nichts gefunden das besagt das es so sein müsste.aber ist cout überhaupt mit einem buffer gesegnet? oder muss es mangels buffer gleich rausschreiben?
meyers deutet hier sowas an: http://www.aristeia.com/Papers/C++ReportColumns/novdec95.pdf
-
char* t ist üblicher
ich schreib auch 'char * t'.