C Programm funktioniert nicht richtig

Danny787

Ensign
Registriert
Jan. 2007
Beiträge
180
ich hab heut versucht ein programm zu programmieren, im prinzip funktionierts, aber noch nicht so wie ich will. hier erstmal der quellcode:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
int number;

printf("\n bitte zahl eingeben: ");
scanf("%d" , &number);

if (number > 0){
printf("\n Eingegebene Zahl ist positiv, Zahl: %d", number);
return 0;

}
if (number ==0){
printf("\n Sie haben die Zahl 0 eingegeben, Zahl: %d", number);

}else{
printf("Eigegebene Zahl ist kleiner 0, Zahl: %d",number);
}
return 0;
}

Der Sinn meines Programms ist, das der User eine beliebige zahl in die console eingibt (int)
und das programm dann unterscheidet zwischen positiver zahl, negativer zahl und null.
beispiel: man gibt 5 in die console ein, dann sagt das programm, die zahl ist positiv, und gibt ne 5 aus. bei der eingabe von 0 sagt das programm, die zahl ist 0 und bei -3 oder so die zahl ist negativ.

mein problem ist nun, dass am anfang der satz "bitte geben sie eine zahl ein" nicht angezeigt wird, jedoch kann man trotzdem eine zahl eingeben und das programm sagt dann auch ob positiv, negativ oder 0.
mein zweites problem ist, das man nur einmal eine zahl in die konsole eingeben kann, danach gehts nicht mehr.
weiß jemand vielleicht rat?

danke schonmal im voraus.

@pjprueller

danke mit dem befehl fflush stdout funktionierts, hat er mir den satz in der konsole angegeben. jetzt hab ich nur noch das problem, dass wenn ich eine zahl eingebe und das programm mit sagt ob die zahl positiv,negativ usw ist, kann ich danach keine weitere zahl eingeben. ich will zb was eingeben, dann programm durchlaufen lassen und danach noch eine weitere zahl eingeben können usw.

hat jemand ne idee?
 
Zuletzt bearbeitet:
Du musst erst den stdout nach dem printen der Frage flushen (rausspülen), dann sollte es klappen.

C hat nämlich einen Buffer für stdout und erst wenn der voll ist wird auch angezeigt, bzw. am Ende eines Programmes und beim erzwungenen flush.

Den genauen Befehl kenn ich nicht, aber such mal einfach nach 'flush'.

Peter
 
Es gibt übrigens auch fflush(stdin) für das flushen der Standardeingabe, ebenfalls wichtig wenn man mit scanf arbeitet.

Wenn du mehrere Prüfungen durchführen willst, musst du das ganze Programm in eine Schleife setzen.
Z.B.:

int z = 1;

[...]

while (z == 1) {

[...Dein Quellcode...]

printf("Noch eine Überprüfung? 0 für Nein, 1 für Ja");
scanf("%i", &z);
}


Es gibt dafür verschiedene Ansätze, du kannst auch nach den Worten "ja" und "nein" abfragen oder nach "j" und "n".
Bei Eingabe von 0 wird die while Schleife übersprungen und du kannst danach dein Programm beenden lassen mit return 0; oder sonst noch irgendwas machen.
 
Es gibt übrigens auch fflush(stdin) für das flushen der Standardeingabe, ebenfalls wichtig wenn man mit scanf arbeitet.

Imho ist das Verhalten von fflush auf einen Inputbuffer undefiniert, bzw. es hängt vom Betriebssystem ab.

\edit
Da war jemand schneller ;)
 
Das wäre mir ehrlich gesagt recht egal, aus zwei Gründen:
1.) Es hat bei mir nie Probleme gemacht, nur beseitigt.
2.) Wenn man es unbedingt für nötig erachtet, kann man es sich später immer noch anders angewöhnen. Ich halte es für sinnfrei, jemandem eine kompliziertere Lösung aufzuzeigen, der scheinbar gerade erst mit C anfängt und nicht einmal eine while Schleife kennt.

Man kann sich damit befassen, wenn man die Basics kennt.
Nichtsdestotrotz habe ich verstanden was das Problem ist, für die ersten Schritte in C aber völlig übertrieben wenn ihr mich fragt.
Und ja, ich bin sicher das ihr als erfahrene Programmierer das anders seht. Will ich aber ehrlich gesagt nicht hören, ich habs ja verstanden und sehe es trotzdem anders.
 
Ah C ...wie ging das nochmal ;) ...also hier eine Lösung was eigentlich genau so funkt wie du das willst:

PHP:
#include <stdio.h>

static int vergleiche(int number) {

  if (number == 0){
    printf("\nSie haben die Zahl 0 eingegeben, Zahl: %d \n", number);
  }
  else if(number > 0){
    printf("\nEingegebene Zahl ist positiv, Zahl: %d \n", number);
  }
  else if (number < 0) {
    printf("\nEigegebene Zahl ist kleiner als 0, Zahl: %d \n",number);
  }
  
  return 0;
}

int main(void) {
  
  int number;
  char c;
  
  while(100) {
    printf("\nBitte zahl eingeben: ");
    scanf("%d" , &number);
    
    vergleiche(number);
    
    printf("\nFalls du abbrechen möchtest einfach 'n' eingeben!");
    scanf("%c", &c);
    if(c == 'n') {
      printf("\nprogramm wurde beendet\n");
      break;
    }
  }
    
  return 0;
}

Kannst ja was dazu fragen bzw. sagen

Gruß
 
DunklerRabe schrieb:
Das wäre mir ehrlich gesagt recht egal, aus zwei Gründen:
1.) Es hat bei mir nie Probleme gemacht, nur beseitigt.
Das ist so nicht richtig. Es hat die Symptome beseitigt, legt aber nahe, dass Du das Problem nicht verstanden hast. fflush(stdin) auf Eingabeströme ist schlichtweg undefiniert. Wenn es bei dir etwas sinnvolles macht, freu dich darüber. Dass es woanders etwas sinnvolles macht, garantiert dir niemand. Deshalb ist es IMHO insbesondere verkehrt es weiter zu empfehlen.

Mal so nebenbei zum eigentlichen Problem - scanf hat auch einen Rückgabewert, der leider immer wieder allzuoft ignoriert wird (der gibt an wieviele Argumente gelesen werden konnten).
 
Glaub mir, ich habe es verstanden.
Ich glaube aber kaum, dass jemand der keine while Schleife kennt, die alternative Lösung versteht. Soll er es doch lieber Schritt für Schritt machen und erstmal versuchen ob fflush(stdin) funktioniert, sofern es Probleme gibt.
 
Wozu braucht man dafür eine Schleife? Das musst du mir jetzt aber wirklich mal erklären.

Das Problem ist hausgemacht und kann mit dem richtigen Umgang mit Eingabeströmen gänzlich vermieden werden (kurz: niemals unformatierten mit formatiertem Output mischen).

Nebenbei muss man dann Berufsanfängern diese Flausen erstmal wieder austreiben.
 
Zurück
Oben