Problem mit printf und scanf



  • Hi Leute, ich nerve mich jetzt schon seit gestern über diesen Mist...
    Also folgendes Programm lässt sich tadellos compillieren:

    #include <cstdio>
    
    int main(){
        int input;
        printf("Input:\n");
        scanf("%d",input);
        printf("Output:%d",input);
        return 0;
    }
    

    erzeugt aber einen Error beim ausführen und stürzt nach scanf ab. Meine Frage: Warum?

    Infos:
    Compiler: MinGW (aktuelleste Version)
    IDE: Code::Blocks (aktuellste Version)
    Debugger: GBD (der von MinGW)
    OS: Vista
    Der Debugger sagt:
    Program received signal SIGSEGV, Segmentation fault.
    Do you want to view the backtrace?

    Dazu muss ich noch sagen ich bin noch ein relativer Anfänger und hab bisher noch nie mit einem Debugger gearbeitet bzw. es nie gelernt und drum weiss ich auch nicht was der mir genau sagen will.
    Ich bin dankbar für jede Hilfe



  • Muss man an scanf nicht einem Pointer übergeben?
    Das sähe dann so aus:

    scanf("%d",&input);
    

    Aber in C++ sollte man für sowas con und cout, also die Streams benutzen. Das ist wesentlich sicherer.
    Beispiel:

    #include <iostream>
    int main() {
     int i = 0;
     std::cout << "Nummer eingeben: " << std::flush; //std::flush zum ausgeben ohne newline
     std::cin >> i;
     std::cout << i << std::endl; //std::endl macht std::flush und ein newline
    }
    


  • DANKE...
    und wieso soll cout uns cin sicherer sein?
    Ich meine ausser es passiert jetzt was wie vorhin eben.
    Mein Problem mit iostream ist die Grösse, ich meine ohne Iostream is z.b. die Application ca. 40 mal kleiner als mit...



  • seeki schrieb:

    und wieso soll cout uns cin sicherer sein?
    Ich meine ausser es passiert jetzt was wie vorhin eben.

    Genau deswegen 😉

    GCC hat aber meines Wissens eine Kommandozeilenoption, die in der Lage ist, solche Fehler aufzuspüren. Versuche mal, -Wformat zu übergeben.



  • Wformat hat funktioniert, er zeigt zwar keinen Fehler aber ne Warnung an.



  • seeki schrieb:

    und wieso soll cout uns cin sicherer sein?

    Vor allem Typsicherheit, die durch die Überladung gewährleistet wird (und im Übrigen die Angabe von Formatflags überflüssig macht). Dann mehr Sicherheit mit Klassentypen, weil keine Funktion mit variabler Parameterlänge im Spiel ist. Meist besserer Schutz vor Pufferüberläufen in Zusammenarbeit mit Klassen wie std::string .

    Auch nützlich ist die leichte Erweiterbarkeit durch Definition eigener Stream-Operatoren.


Anmelden zum Antworten