scanf reagiert nicht



  • Hi Leute!
    Ich bin ein absoluter C++Neuling. Das hier ist mein erster Tread hier! 😃
    Ich habe mich nach einer Woche Tutorials direkt mal in der Community angemeldet. Anders gehts nicht. Oft sind Probleme zu speziell.
    Man wird ja mit etlichen Informationen überhäuft, die man dann doch nicht braucht oder versteht. (Oder sie sind uralt) Dabei scheiterts schon an soetwas:

    *#include "stdafx.h"

    void main (void)
    {
    char Test;
    char Eingabe;

    printf ("Hallo! \n Tippe ein Zeichen ein!\n\n") ;

    scanf("%c",&Eingabe) ; //Zeichen in die Variable speichern
    printf ("%c",Eingabe); //Zeichen ausgeben

    scanf("%c",&Eingabe) ; //Ein anderes Zeichen in die Variable speichern
    printf ("%c",Eingabe); //Zeichen ausgeben

    scanf("%c",&Test) ; //Als Vergleich ein Zeichen in Test speichern
    printf ("%c",Test); // dieses Zeichen ausgeben
    }*
    Ich habe das Programm auf das nötige gekürzt. Die scanf-Befehle stehen aber auch im richtigen Programm so hintereinander.
    Mein Problem ist, dass der 2. scanf-Befehl in die Variable "Eingabe" nicht ordnungsgemäß funktioniert! (Es wird gar nicht erst auf eine Eingabe gewartet!)
    Der 3. scanf-Befehl, der sich dann auf Test bezieht jedoch wieder einwandfrei!
    Ich Probiere jetzt schon eine Stunde hin und her. Eine Antwort im Netz zu finden ist unmöglich. Auch wenn meine Frage wahrscheinlich mehr als Dumm ist, bedanke ich mich für jede Hilfestellung.



  • C oder C++ ?



  • Ich schreibe in "Visual C++ Express 2008 ".
    Aber der Code ist eigentlich C-Code. (halt die alten scanf und printf Befehle aus C)
    ICh hoffe das wolltest du wissen



  • Wenn du C programmieren möchtest, dann geh ins C-Forum ^^ 😛
    Wenn du C++ programmieren möchtest, dann nutz auch die C++-Funktionen...

    bb

    PS:

    void main (void)
    

    Das hat dir aber dein Compiler nicht so generiert?! Er hätte dir vermutlich zumindest nen int main() generiert...



  • unskilled schrieb:

    void main (void)
    

    Das hat dir aber dein Compiler nicht so generiert?!

    Dein Compiler generiert dir C/C++-Code? 🤡 Meiner nicht.
    Obwohl...haben die ersten C++-Compiler nicht C-Code erzeugt?



  • 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


Anmelden zum Antworten