scanf reagiert nicht



  • Wenn ich nicht "leeres Projekt" anwähle, dann generiert er mir idR ein int main(int argc, char *argv[]) mit vorkompiliertem header usw...
    ist aber btw nich mein compiler sondern meine entwicklungsumgebung ;P

    bb

    Obwohl...haben die ersten C++-Compiler nicht C-Code erzeugt?

    Und ist es nicht Nachts kälter als draußen?



  • Der macht als Default-Vorgabe immer eine INT-Mainfunktion.
    Aber warum sollte ich Main unbedingt mit einer Ausgabe nutzen? 😕
    Da ist Void doch viel angebrachter!

    Abgesehen davon bin ich dem Problem, dass sicherlich auch C++könner erklären können noch nicht auf dei Schliche gekommen! 😞

    PS: Wie kann ich meinen Tread nachträglich noch verschieben? Je nachdem wie manns auslegt könnte es auch ins C-Abteil.



  • Aus dem C-Abteil - das Problem ist hier erlaeutert:

    http://www.gidnetwork.com/b-60.html



  • Balu Jr. schrieb:

    Da ist Void doch viel angebrachter!

    Nein, wäre es nicht. Wenn man das Programm vom Betriebssystem aufruft, will man je nachdem einen Rückgabewert. Und laut C++- und C-Standards muss dieser int sein, void ist nicht nur unüblich, sondern falsch.

    Balu Jr. schrieb:

    PS: Wie kann ich meinen Tread nachträglich noch verschieben? Je nachdem wie manns auslegt könnte es auch ins C-Abteil.

    Das können nur Administratoren. Vielleicht ist ja einer so lieb... 🙂



  • Dieser Thread wurde von Moderator/in volkard aus dem Forum C++ in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Balu Jr. schrieb:

    Aber warum sollte ich Main unbedingt mit einer Ausgabe nutzen? 😕
    Da ist Void doch viel angebrachter!

    Aber warum sollte ich bei rot anhalten? 😕
    wenn ich die Ampel ignoriere, komme ich ganz sicher schneller an!



  • Zum Eigentlichen Thema: Der Grund ist, daß die Konsole immer eine ganze Zeile einliest. Das erste scanf() liest das eingegebene Zeichen ein und das zweite scanf() *immer* das abschließende new-line.

    Deshalb ist es auch besser bei Konsoleneingaben immer eine ganze Zeile (zb mit fgets() oder getline()) einzulesen und die dann mit sscanf() oä zu verarbeiten.



  • Hey Danke Leute!
    BEsonders an Konfusius! Der hat ja sogar eine logische Antwort auf mein eigentliches Problem.
    Nochmal zu der Void-Main-Funktion:
    Ich glaube euch das gerne und das ist schwer logisch. (Besonders die Ampelmetapher von Supertux).
    Das es aber FALSCH ist hätte ich nicht gedacht.
    Das man die Main-Funktion einfach als Void definieren kann, steht zum Beispiel (da habe ich es auch her) im C-Tutorial des "AOL-Programmierforum-leaders" Sebastian Cyris. Zumindest macht er das in seinen Beipielen.



  • Balu Jr. schrieb:

    Nochmal zu der Void-Main-Funktion:
    Ich glaube euch das gerne und das ist schwer logisch. (Besonders die Ampelmetapher von Supertux).
    Das es aber FALSCH ist hätte ich nicht gedacht.

    das würde ich nicht so ernst nehmen. für viele hier ist 'void main' ein rotes tuch. es steht zwar im c-standard, dass main int zurückgeben soll und im internet findet man tatsächlich (als 'beweis' seltsam konstruierte) beispiele, in denen 'void main' zum problem wird. aber in 99.999...% aller fälle, ist es egal. soll heissen, das programm gibt trotzdem 'ne 0 zurück, ob du nun 'void main' benutzt oder das return weglässt (was sogar erlaubt ist).
    🙂



  • Balu Jr. schrieb:

    (Besonders die Ampelmetapher von Supertux).
    Das es aber FALSCH ist hätte ich nicht gedacht.
    Das man die Main-Funktion einfach als Void definieren kann, steht zum Beispiel (da habe ich es auch her) im C-Tutorial des "AOL-Programmierforum-leaders" Sebastian Cyris. Zumindest macht er das in seinen Beipielen.

    und meine Methapaher kann ich weiter ausführen 😉

    es gibt Leute, die bei rot über die Ampel fahren und ihnen ist noch nie was passiert. Aber wer kann garantieren, dass sie nie einen Unfall bauen? Du kannst jahrelang die Ampel ignorieren, aber irgendwann wird es KRACH machen.

    Mit int/void main ist es ähnlich. Sicher wird es Fälle, wo der Rückgabewert bedeutungslos ist, aber kannst du garantieren, dass das immer der Fall sein wird?

    Die meisten GUI Anwendern, die ihre Anwendungen durch Doppelklick starten und von einer SHELL noch nie was gehört haben, werden das kaum verstehen. Wer aber sich mit SHELL Skripten befasst hast (z.b. .BAT, bash, tcsh, was weiß ich noch) haben, werden wissen, dass die Rückgabe eines Programms in vielen Fällen einfach notwendig ist, um fortfahren zu können:

    # irgendein skrip
    progA && progB
    progC
    if progCs Return status != 0
      echo "ERROR"
      exit
    endif
    

    In der ersten Zeile progA && progB verlässt man sich, dass progA stets einen gültigen Rückgabewert zurückliefert, nämlich 0 für 'fehrlos', != 0 für 'fehlerhaft'. Denn nur dann, wenn progA fehlerlos endet, muss progB gestartet werden. Würde aber progA void main haben, könnte das OS nicht herausfinden, ob der Prozess fehlerlos oder fehlerhaft geendet hat. Und da macht es "KRACH", weil du ein undefiniertes Verhalten in deinem Skript hast. Das gleiche gilt bei progC .

    Ich weiß leider nicht genau, seit wann int main im Standard aufgenommen wurde, aber früher (zumindest unter DOS) war es schon ok void main zu verwenden. Ich hab damals es auch nicht anders gelernt. Im Netz findet man leider haufenweise altes Zeug, was nicht die neuen Standarisierungen beinhalten und diese verwenden i.d.R void main.



  • supertux schrieb:

    Würde aber progA void main haben, könnte das OS nicht herausfinden, ob der Prozess fehlerlos oder fehlerhaft geendet hat. Und da macht es "KRACH", weil du ein undefiniertes Verhalten in deinem Skript hast.

    zum glück rufen shell-scripte nicht direkt main-funktionen auf und ausserdem gibt die main eines c-programms bei fehlendem 'return' eine 0 zurück (weil z.b. das register, das den rückgabewert zurückgibt vorher schon mit 'ner 0 initialisiert wurde).
    🙂



  • +fricky schrieb:

    supertux schrieb:

    Würde aber progA void main haben, könnte das OS nicht herausfinden, ob der Prozess fehlerlos oder fehlerhaft geendet hat. Und da macht es "KRACH", weil du ein undefiniertes Verhalten in deinem Skript hast.

    zum glück rufen shell-scripte nicht direkt main-funktionen auf und ausserdem gibt die main eines c-programms bei fehlendem 'return' eine 0 zurück (weil z.b. das register, das den rückgabewert zurückgibt vorher schon mit 'ner 0 initialisiert wurde).
    🙂

    und wenn der Prozess fehlerhaft endet und trotzdem 0 zurückgegeben wird, dann wird progB ausgeführt, obwohl es nicht sein soll.



  • supertux schrieb:

    und wenn der Prozess fehlerhaft endet und trotzdem 0 zurückgegeben wird, dann wird progB ausgeführt, obwohl es nicht sein soll.

    wer'n shell-script macht, sollte doch eigentlich wissen, was die programme zurückgeben, wenn das script drauf reagieren soll. ein program das immer 0 zurückgibt, ist vielleicht nicht so toll für scripte.
    🙂



  • +fricky schrieb:

    wer'n shell-script macht, sollte doch eigentlich wissen, was die programme zurückgeben, wenn das script drauf reagieren soll.
    🙂

    Hast du jemals shell-script geschrieben? Das ist in Fällen einfach notwendig. Unter Unix gibt es sogar tools, die einen bestimmten Return Wert haben, wenn etwas passiert und darauf muss man achten (mir fällt mir auf die schnelle keins). Das wichtigtse Werkzeug /usr/bin/test ist ein Bsp, warum man sich auf den Return Wert verlässt. Und Ketten wie a && b && c sind auch üblich.

    +fricky schrieb:

    ein program das immer 0 zurückgibt, ist vielleicht nicht so toll für scripte.

    darüber rede ich die ganze Zeit.



  • Ich bin geläutert!
    In Scripten, ich kann aus eigener erfahrung nur für die Bash sprechen, ist es wirklich nötig! Und soviel Mehraufwand ist ein int-main nun wirklich nicht. 😃

    Danke



  • Balu Jr. schrieb:

    Und soviel Mehraufwand ist ein int-main nun wirklich nicht

    richtig, aber wenn, dann gib auch fehlercodes aus der main zurück und nicht in jedem fall 0.
    🙂



  • Das Thema war für mich eigentlich schon beendet, aber das hab ich gerade zufällig gesehen und passt einfach zu gut zu unserem off-topic-Thema:
    http://www.c-plusplus.net/forum/viewtopic.php?t=39346

    Ich hab es gesehen, als ich die FAQ durchgegangen bin.



  • Balu Jr. schrieb:

    Ich hab es gesehen, als ich die FAQ durchgegangen bin.

    das beste daran ist die formulierung 'absolut illegal' mit ausrufezeichen dahinter.
    🙂



  • Nur mal so +fricky:
    Warum meldest du dich nicht im Forum an?
    Es scheint mir nun nicht gerade so als dass du nicht genug Ahnung hättest. (<--Man beachte diesen wunderschönen Satz!)

    Hier findet man doch nun wirklich immer Ansprache!
    Zumindest ist es bei mir so seit ich mich vor 3 Tagen registriert habe.



  • Balu Jr. schrieb:

    Nur mal so +fricky:
    Warum meldest du dich nicht im Forum an?

    warum sollte ich? so geht's doch auch.
    🙂


Anmelden zum Antworten