Frage zu C++ Reference und anderen Quellen


  • Mod

    manni66 schrieb:

    Wo werden da Beispiele in C geschrieben?

    Die Beispiele zu den Funktionen der C-Standardbibliothek lassen sich auch mit einem C-Compiler übersetzen. Jedoch sind sie so gestellt, dass man auch einen C++-Compiler nutzen kann, an den Stellen, an denen es sonst eigentlich einen Unterschied machen würde.



  • Warum sollte in der C Standardbibliothek kein C Code auftauchen?
    Das C++ Beispiel für isdigit ist auch in C++
    http://www.cplusplus.com/reference/locale/isdigit/



  • manni66 schrieb:

    Wo werden da Beispiele in C geschrieben?

    Ich habe z. B. die Funktion strncpy angeschaut.

    Folgender Code ist per copy und paste von dieser Seite hier: http://www.cplusplus.com/reference/cstring/strncpy/

    /* strncpy example */
    #include <stdio.h>
    #include <string.h>
    
    int main ()
    {
      char str1[]= "To be or not to be";
      char str2[40];
      char str3[40];
    
      /* copy to sized buffer (overflow safe): */
      strncpy ( str2, str1, sizeof(str2) );
    
      /* partial copy (only 5 chars): */
      strncpy ( str3, str2, 5 );
      str3[5] = '\0';   /* null character manually added */
    
      puts (str1);
      puts (str2);
      puts (str3);
    
      return 0;
    }
    

    Sone schrieb:

    Jedoch besteht die C++-Standardbibliothek teilweise noch aus der alten, fast komplett makellos übernommenen C-Standardbibliothek.

    Also sprich, ich könnte alles, was in C möglich ist, auch in C++ machen?? Ich muss es nur schaffen, die Beispiele auf http://en.cppreference.com/w/ und http://www.cplusplus.com/reference/ auf C++ zu transfermieren?



  • Warum sollte man strcpy in C++ benutzen?



  • silent_max schrieb:

    manni66 schrieb:

    Wo werden da Beispiele in C geschrieben?

    Ich habe z. B. die Funktion strncpy angeschaut.

    Das ist ja auch eine C-Funktion! In C++ würde man doch von vornherein

    char str1[]= "To be or not to be";
      char str2[40];
      char str3[40];
    

    vermeiden und stattdessen

    std::string str1 = "To be or not to be";
      std::string str2;
      std::string str3;
    

    nehmen, wo immer es möglich ist!



  • manni66 schrieb:

    Warum sollte man strcpy in C++ benutzen?

    Manni, es war nur ein Beispiel von vielen...



  • Dass zur Erläuterung der C-Funktionen Beispiele in C geschrieben sind, finde ich nun aber nicht sonderlich überraschend!



  • Das hier z. Bsp. habe ich gesucht:

    http://en.cppreference.com/w/cpp/utility/functional

    Eine Erläuterung von C++ Funktionen



  • silent_max schrieb:

    manni66 schrieb:

    Warum sollte man strcpy in C++ benutzen?

    Manni, es war nur ein Beispiel von vielen...

    Ja. Wenn du ein C Beispiel in der Referenz siehst, bist du vermutlich an der falschen Stelle, und solltest nach C++ suchen!



  • silent_max schrieb:

    Das hier z. Bsp. habe ich gesucht:

    http://en.cppreference.com/w/cpp/utility/functional

    Eine Erläuterung von C++ Funktionen

    Das erläutert kein Funktionen. Wenn du eine Erläuterung zu Funktionen brauchst, musst du ein C++ Lehrbuch verwenden aber sicher keine Referenz!



  • manni66 schrieb:

    Das erläutert kein Funktionen. Wenn du eine Erläuterung zu Funktionen brauchst, musst du ein C++ Lehrbuch verwenden aber sicher keine Referenz!

    Glaubst Du, dass ein C++ Lehrbuch auslangt?



  • silent_max schrieb:

    manni66 schrieb:

    Das erläutert kein Funktionen. Wenn du eine Erläuterung zu Funktionen brauchst, musst du ein C++ Lehrbuch verwenden aber sicher keine Referenz!

    Glaubst Du, dass ein C++ Lehrbuch auslangt?

    Wenn es gut ist und man es liest. ⚠



  • Sone schrieb:

    Wenn es gut ist und man es liest. ⚠

    Wenn man es durcharbeitet.
    Das ist ein Lehrbuch. Zum lernen, nicht nur für schöne Gedanken.



  • DirkB schrieb:

    Sone schrieb:

    Wenn es gut ist und man es liest. ⚠

    Wenn man es durcharbeitet.

    🙄



  • silent_max schrieb:

    Also sprich, ich könnte alles, was in C möglich ist, auch in C++ machen?? Ich muss es nur schaffen, die Beispiele auf http://en.cppreference.com/w/ und http://www.cplusplus.com/reference/ auf C++ zu transfermieren?

    Korrekt, du brauchst nichtmal was transferieren. C++ ist eine Erweiterung von C, hieß auch mal C mit Klassen. Es gibt die Ausnahme mit dem impliziten Cast von void * auf einen beliebigen Pointer was in C geht und in C++ nicht, aber ansonsten geht alles in C++ genauso wie in C.
    Allerdings hat C++ versucht bessere oder zumindest andere Möglichkeiten bereit zu stellen, sodass es häufig zwei Möglichkeiten gibt. char * vs std::string, x[] vs std::vector<x>, printf vs std::cout, malloc/free vs new/delete ....
    Nicht immer sind die C++-Varianten besser. Häufig wird es aber als schlechten Stil angesehen wenn man die Varianten mischt und Leute wie Sone regt es maßlos auf wenn man im C++-Forum was mit printf schreibt, obwohl es korrektes C++ ist.
    Du solltest für dich entscheiden, ob du strikt C++ machen willst, alla "C ist Teufelszeug" oder auch die C-Funktionen nutzen willst. Wenn du reines C++ willst, was keine schlechte Idee ist, dann solltest du #includes, die mit .h enden oder mit c anfangen eher meiden (gibt sicher Ausnahmen).

    *wartet auf Sones gepolter* :trollface:



  • geht alles in C++ genauso wie in C.

    Nein. Es gibt viele Kleinigkeiten, wie der Scope einer im for-init-statement deklarierten Variable.

    char * vs std::string

    Das ist kein Kampf. std::string hat so gut wie überall gewonnen. Ausnahme: absolute Performance.

    malloc/free vs new/delete

    malloc und free sind in C++ absolut Tabu.

    Leute wie Sone regt es maßlos auf wenn man im C++-Forum was mit printf schreibt, obwohl es korrektes C++ ist.

    printf hat deutliche Nachteile gegenüber den C++-Streams, und kooperiert auch einfach nicht mit cout (bspw. Failbits). Daher sollte es einfach nicht verwendet werden.

    Wenn du reines C++ willst, was keine schlechte Idee ist, dann solltest du #includes, die mit .h enden oder mit c anfangen eher meiden (gibt sicher Ausnahmen).

    Nein, der ganze Tipp ist Blödsinn.

    *wartet auf Sones gepolter* :trollface:

    Nach so eine Post ist das ja auch kein Wunder.



  • std::string verwendet Heap-Allocation (ausser bei extrem kurzen Strings) und ist somit gar nicht so toll wie hier immer angepriesen wird. Jede Heap-Allocation ist sau teuer.



  • std::string ist eine Stringklasse für den Alltag. Sie hat gar nicht den Anspruch, in jeder möglichen Situation die beste zu sein. Ihr Design ist auch umstritten, ausserdem kommt man im Bezug auf Locales und Unicode an die Grenzen.

    Fakt ist: char* mit manueller Speicherverwaltung ist keine Alternative. Das ist schlicht zu fehleranfällig und benötig zu viel Boilerplate-Code, um produktiv eingesetzt zu werden. Für spezifische Anwendungsszenarien nimmt man sich eine auf den Fall zugeschnittene Klasse oder implementiert selbst eine.



  • Sone schrieb:

    geht alles in C++ genauso wie in C.

    Nein. Es gibt viele Kleinigkeiten, wie der Scope einer im for-init-statement deklarierten Variable.

    Zeig mal ein Beispiel, dass in C geht und in C++ nicht.

    Sone schrieb:

    Leute wie Sone regt es maßlos auf wenn man im C++-Forum was mit printf schreibt, obwohl es korrektes C++ ist.

    printf hat deutliche Nachteile gegenüber den C++-Streams, und kooperiert auch einfach nicht mit cout (bspw. Failbits). Daher sollte es einfach nicht verwendet werden.

    Natürlich nicht. Als printf entworfen wurde hat niemand gedacht, dass es ein Objekt für Ausgaben geben könnte. Genauso gut könnte man sagen, dass cin schlecht ist, weil es nicht mit fscanf kooperiert.

    Sone schrieb:

    char * vs std::string

    Das ist kein Kampf. std::string hat so gut wie überall gewonnen. Ausnahme: absolute Performance.

    Ich habe nicht von Kämpfen gesprochen, sondern von einem C-Weg und einem C++-Weg, die am Ende dasselbe tun, aber irgendwie doch verschieden und häufig inkompatibel zueinander sind.



  • nwp3 schrieb:

    Sone schrieb:

    geht alles in C++ genauso wie in C.

    Nein. Es gibt viele Kleinigkeiten, wie der Scope einer im for-init-statement deklarierten Variable.

    Zeig mal ein Beispiel, dass in C geht und in C++ nicht.

    void f(const a);
    
    int main(void) {return 0;}
    

    nwp3 schrieb:

    Sone schrieb:

    Leute wie Sone regt es maßlos auf wenn man im C++-Forum was mit printf schreibt, obwohl es korrektes C++ ist.

    printf hat deutliche Nachteile gegenüber den C++-Streams, und kooperiert auch einfach nicht mit cout (bspw. Failbits). Daher sollte es einfach nicht verwendet werden.

    Natürlich nicht. Als printf entworfen wurde hat niemand gedacht, dass es ein Objekt für Ausgaben geben könnte. Genauso gut könnte man sagen, dass cin schlecht ist, weil es nicht mit fscanf kooperiert.

    Dafür ist std::cin im Gegensatz zu fscanf Typsicher, IMO lesbarer und besser auf Fehler prüfbar.

    Oder wie viele C-Programmierer die du kennst, prüfen nach jedem Benutzen von fscanf feof(stdin) oder ferror(stdin) ?
    Oder den Rückgabewert?

    nwp3 schrieb:

    Sone schrieb:

    char * vs std::string

    Das ist kein Kampf. std::string hat so gut wie überall gewonnen. Ausnahme: absolute Performance.

    Ich habe nicht von Kämpfen gesprochen, sondern von einem C-Weg und einem C++-Weg, die am Ende dasselbe tun, aber irgendwie doch verschieden und häufig inkompatibel zueinander sind.

    std::string hat wieder deutliche Vorteile gegenüber C-Strings, die dir eigentlich bekannt sein sollten.


Anmelden zum Antworten