C Code mehrmals durchlaufen unter Mac OS X -gelöst-

  • Themenstarter Themenstarter Gelöschtes Mitglied 3772
  • Beginndatum Beginndatum
G

Gelöschtes Mitglied 3772

Guest
Hallo zusammen,
ich habe ein merkwürdiges Problem.
Erstmal ein Beispiel
Code:
#include<stdlib.h>
#include<iostream.h>
#include<stdio.h>
#include<math.h>

int main(void)
{
fflush(stdin);                                                                  //Eingabepuffer leeren
int index;
int zahl=0;
int grenze=0;
char reset,anwendungen;                                                         //char reset fuer Programmwiederholung
int is_primzahl(int zahl);

do                                                                              //Hauptschleife f¸r Programmwiederholungen
{
//system("cls");                                                                  //Bildschirm leeren
printf("\nAufgabe P7A1\n\n");
fflush(stdin);
printf("Ueberpruefung ob Zahl Primzahl ist\n");

do{
printf("\nNur eine [Z]ahl ueberpruefen, oder bis zu einer [G]renze pruefen?\n");
scanf("%c", &anwendungen);
anwendungen=toupper(anwendungen);
if(anwendungen!='Z' && anwendungen!='G'){
                                printf("\nUngueltige Eingabe");
                        }

}while(anwendungen!='Z'&& anwendungen!= 'G');

if(anwendungen=='Z')
{
fflush(stdin);
printf("\nBitte Zahl eingeben\n");
scanf("%i", &zahl);

if(is_primzahl(zahl)==0)
        printf("Die Zahl %i ist keine Primzahl\n", zahl);
if(is_primzahl(zahl)==1)
        printf("Die Zahl %i ist eine Primzahl\n", zahl);
}
if(anwendungen=='G')
{
fflush(stdin);
printf("\nBitte obere Grenze eingeben\n");
scanf("%i", &grenze);
printf("\n");

for(index=2;index<=grenze;index++)
{
if(is_primzahl(index)==1)
        printf("%i\n", index);
}

}


/** Programm wiederholen? **/
printf("\nProgramm wiederholen? (J)a/(N)ein\n");
fflush(stdin);
scanf("%c",&reset);          //Hier liegt das Problem denke ich :-/
reset=toupper(reset);

}while(reset!='N');           //Oder doch bei dem Vergleich? Vllt vergleicht ein Unix system anders als ein Windows?

fflush(stdin);                                                                  //Eingabepuffer leeren
return 0;
}


int is_primzahl(int zahl)
{
int index;
for (index=2; index < zahl; index++)
if (zahl % index == 0)
return 0;
return 1;
}
Wenn ich diesen Code unter Windows kompiliere funktioniert die Abfrage auf Wiederholung einwandfrei, allerdings funktioniert dieser Code bei mir unter Mac OS X insofern nicht, als das er nach der Frage ob das Programm wiederholt werden soll nicht auf eine Eingabe wartet (auch schon ohne fflush() getestet, selbe Ergebnis) und direkt wieder am Kopf der DO-WHILE Schleife anfängt. An der Uni müssen wir den Borland Builder nutzen, da funktioniert es.
Aber ich würde halt gern mit meinem Macbook programmieren und da will ich nicht extra ne VM aufsetzen in der dann Windows mit dem Borlandbuilder läuft, da sträuben sich mir die Haare :D
Vielleicht weiß ja jemand wo das Problem liegt, und bitte die komische Formatierung erstmal nicht beachten ;)

//edit: Ich nutze Netbeans 6.5 unter Mac OS X

//edit2: Okay, ich habe das ganze gerade mal auf meinem Server kompiliert und laufen lassen unter Archlinux mit dem gcc.
Da tritt genau das gleiche Problem auf, das die Frage auf wiederholung einfach übergangen wird
als wenn noch ein ENTER im Puffer irgendwo steht, was ja nicht sein sollte. Dafür ist ja extra das fflush(stdin);
Wirklich seltsam das es nur unter Borland so funktioniert wie es soll :-/

Vielen Dank
 
Zuletzt bearbeitet von einem Moderator:
Ist jetzt nur eine Vermutung aber es koentne damit zusammenhaengen wie der Mac new lines behandelt. (http://en.wikipedia.org/wiki/Newline) Versuch mal

Code:
char crlf[10];
crlf = System.getProperty( "line.separator" );
und dann ersetze alle "\n" mit "crlf"
 
Danke für deine Mühe, ich habe das Problem aber soeben gelöst.
Es hing doch mit dem fflush(stdin) zusammen. Habe das komplett rausgenommen und jetzt nach der scanf() ob das programm wiederholt werden soll noch ein getchar(); gesetzt. Nun funktioniert es einwandfrei.
 
Ich hab mich soeben mit dem Debugger gespielt und das Problem ist das bei dir im stdin noch das "\n" vom letzten mal steckt du musst also den input stream kuebeln - aber achtung deine jetzige loesung funktioniert super wenn ein user echtne input angibt aber wenn ich sagen wir mal

als Zahl 24\n\n\n\n\n eingeben hast das selbe problem wieder. Dein scanf sucht und list nur eine zahl und ignoriert alles andere. Was du also tun musst ist den gesamten stdin clearen nach der Eingabe. Genauere Erklaerung des Problems hier : http://bytes.com/topic/c/answers/462887-using-scanf-while-loop
 
Zuletzt bearbeitet:
Zurück
Oben