Linus Torvalds: Java A Horrible Language



  • ich bins schrieb:

    printf ist tatsächlich eines der Dinge, die ich im C++ Standard vermisse.

    Ist es denn rausgeflogen?



  • Tim schrieb:

    Ist es denn rausgeflogen?

    Er meint vermutlich ein typsicheres Äquivalent zu printf.



  • ich bins schrieb:

    printf ist tatsächlich eines der Dinge, die ich im C++ Standard vermisse. Ich bevorzuge zwar std::iostream aber für Formatierung ist das nicht gut geeignet. Da ist printf besser. Versucht mal eine Ausgabe wie:

    3.14
    4.67
    12.12
    334.34

    mit iostream-Mitteln hizubekommen. Klar kann man sich was bauen. Aber genau das ist das Problem: es ist nicht einfach nur da. Ich kann ja auch keinen Java-Anhänger von C++ überzeugen, indem ich ihm sage, er kann doch mit C++ Java bauen.

    Genau, selbst Java hat printf. 🙂



  • Bei scanf verstehe ich es ja irgendwie noch, da hat man in bestimmten Situationen gewaltige Vorteile.
    Aber printf ist doch wirklich gut ersetzbar.



  • scanf: Also leichter kann man BufferOverflows nicht zustande bringen...



  • Steffo schrieb:

    scanf: Also leichter kann man BufferOverflows nicht zustande bringen...

    Doch, mit gets.



  • Steffo schrieb:

    scanf: Also leichter kann man BufferOverflows nicht zustande bringen...

    Mit einem kleinen bischen mitdenken passiert das aber nicht.



  • Ethon schrieb:

    Steffo schrieb:

    scanf: Also leichter kann man BufferOverflows nicht zustande bringen...

    Mit einem kleinen bischen mitdenken passiert das aber nicht.

    Das ist bei scanf sehr schwer.
    Prinzipiell tut man ja eher fgets machen und darauf dann sscanf. Da man sich sonst schwer tut buffer overflows zu verhinden...

    printf dagegen ist super.


  • Mod

    ich bins schrieb:

    Versucht mal eine Ausgabe wie:

    3.14
      4.67
     12.12
    334.34
    

    mit iostream-Mitteln hizubekommen. Klar kann man sich was bauen.

    Ich weiß nicht recht. Ist das so viel schlimmer, eine Zeile mit recht klar sprechenden Bezeichnern zusätzlich zu haben, anstatt einem Formatstring bei dem man die Bedeutung der einzelnen Felder auch erst einmal nachschlagen muss? Den C-testfall habe ich jedenfalls beim Programmieren spontan falsch gemacht, weil ich nicht sicher war, welche Bedeutung die erste Zahl genau hat und erst einmal nachschlagen musste. Ist daher wohl eher eine Sache davon, was man gewöhnt ist und was nicht:

    #include <iostream>
    #include <iomanip>
    #include <cstdio>
    
    using namespace std;
    
    int main()
    {
      double numbers[] = {1.2, 1.234, 12.34, 123.4, 123.456, 12.3, 1.};
    
      cout << "C++ Streams:\n";
      cout << fixed << right << setprecision(3);
      for (unsigned i = 0; i < sizeof(numbers)/sizeof(*numbers); ++i)
        cout << setw(7) << numbers[i] << '\n';
    
      puts("C I/O:");
      for (unsigned i = 0; i < sizeof(numbers)/sizeof(*numbers); ++i)
        printf("%7.3f\n", numbers[i]);   
    }
    


  • Ich finde printf schöner. (Und ich bin es bestimmt nicht mehr gewohnt. :p)



  • ich bins schrieb:

    Versucht mal eine Ausgabe wie:

    3.14
    4.67
    12.12
    334.34

    mit iostream-Mitteln hizubekommen.

    Ist doch ganz einfach:

    cout << "  3.14";
    cout << "  4.67";
    cout << " 12.12";
    cout << "334.34";
    

    🕶



  • @Cooler Coder
    😃
    🕶


  • Mod

    Das ist noch nicht einmal richtig, aber keiner hat's gemerkt 😃 .



  • Shade Of Mine schrieb:

    Ethon schrieb:

    Steffo schrieb:

    scanf: Also leichter kann man BufferOverflows nicht zustande bringen...

    Mit einem kleinen bischen mitdenken passiert das aber nicht.

    Das ist bei scanf sehr schwer.
    Prinzipiell tut man ja eher fgets machen und darauf dann sscanf. Da man sich sonst schwer tut buffer overflows zu verhinden...

    printf dagegen ist super.

    Nochmal: Wo ist das Problem? Man gibt einfach maximale Stringlängen an, die dem Buffer entsprechen, und fertig.



  • Ethon schrieb:

    Nochmal: Wo ist das Problem? Man gibt einfach maximale Stringlängen an, die dem Buffer entsprechen, und fertig.

    Wo gibst du diese maximalen Stringlängen denn an?



  • Na so:

    char buffer[256];
    scanf("%255s", buffer);
    

  • Mod

    Ethon schrieb:

    Nochmal: Wo ist das Problem? Man gibt einfach maximale Stringlängen an, die dem Buffer entsprechen, und fertig.

    Da bekommst du aber auch lustige Effekte. Beantworte zum Beispiel mal die Frage, wo der Lesezeiger steht, nachdem eine zu lange Eingabe kommt und was das für den weiteren Programmverlauf bedeutet.



  • Da bekommst du aber auch lustige Effekte. Beantworte zum Beispiel mal die Frage, wo der Lesezeiger steht, nachdem eine zu lange Eingabe kommt und was das für den weiteren Programmverlauf bedeutet.

    Hmm, das kann man doch meistens über den Returnwert abfangen.
    Imho ist das aber ein schwerer Fehler, auf den man nicht zwingend reagieren können muss.

    Als Alternative hat zb der GCC ne Extension um den String gleich komplett dynamisch anzulegen:

    char* out;
    scanf("%as", &out);
    puts(out);
    free(out);
    


  • Ethon schrieb:

    Da bekommst du aber auch lustige Effekte. Beantworte zum Beispiel mal die Frage, wo der Lesezeiger steht, nachdem eine zu lange Eingabe kommt und was das für den weiteren Programmverlauf bedeutet.

    Hmm, das kann man doch meistens über den Returnwert abfangen.
    Imho ist das aber ein schwerer Fehler, auf den man nicht zwingend reagieren können muss.

    Das mein Nachname zu lang ist, ist ein schwerer Fehler?
    Das ist leider ein echtes Problem mit scanf - denn es ist nicht trivial die zulange Eingabe korrekt zu verarbeiten.

    Ein anderes Problem ist, dass es schwer verifizierbar ist, ob die laenge korrekt ist. Bei fgets kann ich einfach sizeof(buffer) als laenge angeben.



  • SeppJ schrieb:

    Ich weiß nicht recht. Ist das so viel schlimmer, eine Zeile mit recht klar sprechenden Bezeichnern zusätzlich zu haben, anstatt einem Formatstring bei dem man die Bedeutung der einzelnen Felder auch erst einmal nachschlagen muss?

    Kein gutes Argument. Deine klar sprechenden Bezeichner muss man auch erst nachschlagen. Schliesslich braucht man da mehrere Funktionen um etwas einfach zu formatieren.

    Weiterhin erkenne ich an einem Formatstring, was am Ende rauskommt, besser als wenn ich da 5 lange Funktionennamen eintippe.

    Es ist eher subjektiv, aber ich finde bei printf muss man weniger oft nachschlagen als wenn man es mit C++ boardmitteln macht.


Anmelden zum Antworten