Ein Benutzer kann verschiedene Zahlenmengen eingeben (sofern er nicht mehr als 5000 Zahlen eingibt). Wenn der Benutzer jedoch STRG + D drückt, sollte das Programm keine Benutzereingaben mehr anfordern. Ich habe das bisher gemacht. Ich muss jedoch zweimal STRG + D drücken, bevor es stoppt. Könnte mir jemand helfen, das Problem zu beheben?

int input_array[MAX_NUMBERS] = {0};

scanf("%d", &input_array[0]);

int eof_detector = getchar();

int i = 0;
while ((i < 5000) && (eof_detector != EOF)) {
    i++;
    scanf("%d", &input_array[i]);
    eof_detector = getchar();
}
1
Zoey Malkov 18 Apr. 2018 im 12:56

4 Antworten

Beste Antwort

Hier ist eine einfachere Lösung.

// When the person presses CTRL+D, scanf will return EOF.
// Since the return value is EOF and not 1, it will break
// out of the scanning while loop.
// Also note, you can scan numbers as a while loop
// condition.
int input_array[MAX_NUMBERS] = {0};

int i = 0;
while (
       (scanf("%d", &input_array[0]) == 1) &&
       (i < MAX_NUMBERS)
      ) {
    i++;
}
2
Aniket 16 Juni 2018 im 07:43

Sie benötigen getchar nicht separat, um zu überprüfen, ob EOF erreicht wurde. scanf gibt selbst ein EOF zurück, wenn das Datenende erreicht ist. Ihre Schleife wird so funktionieren

  do {
      ret = scanf("%d", &input_array[i]);
      i++;
     } while ((i < 5000) && (ret != EOF));
1
Noufal Ibrahim 18 Apr. 2018 im 10:07

Es ist wahrscheinlich, dass Sie in scanf auf EOF stoßen. Testen Sie also den Rückgabewert von scanf und rufen Sie feof(stdin) auf, um festzustellen, ob die scanf fehlschlägt Der Fehler war auf ein EOF oder einen Fehler zurückzuführen.

for(i=1;i<4999;i++){
   if(EOF==scanf("%d", &input_array[i])){
      if(feof(stdin)) /*EOF*/; else /*error*/;
      break;
   }
}

Wie auf der Manpage scanf (3) angegeben, gibt scanf auf beiden EOF zurück Ein Fehler (in diesem Fall wird errno auf einen der in der Manpage aufgeführten Werte gesetzt) ​​oder EOF.

1
PSkocik 18 Apr. 2018 im 10:09

Sie müssen getchar() nicht separat vor der Schleife und innerhalb der Schleife verwenden. Verwenden Sie getchar() in Bedingung & auch scanf() gibt EOF zurück, wenn es auf Ende der Eingabe stößt. Überprüfen Sie daher den Rückgabewert von scanf(). Mach das so

int main() {
        int input_array[MAX_NUMBERS] = {0};
        int i = 0,ret;

        do {
                ret = scanf("%d", &input_array[i]);/* if you pressed
                                              CTRL+D, scanf return EOF */
                if(ret == EOF)/* if ctrl+d pressed,condition becomes true */
                        break;
                i++;
        }while ((i < 5000) && (getchar() != EOF));/* it won't check this
                                             bcz of break statement if CTRL+d pressed */
        return 0;
}
1
Achal 18 Apr. 2018 im 11:04