Scanf nur Integers ausgeben lassen

01/08/2017 18:19 Jon'Irenic#1
Hey ich habe mir eine einfache Funktion rausgesucht, welche nur integer ausgibt und dazu eine Frage:

Code:
int lese_int() {
    int number = 0;
    int ret = 0;
    char c;
    printf("Bitte geben sie eine Nummer ein: ");
    while (ret == 0) {
        ret = scanf("%d%c", &number, &c);
        while (c != '\n' && getchar() != '\n') {};
        if (ret == 0)
            printf("\nDas war keine Nummer. Versuchen sie es erneut: ");
    }

    return number;
}
Also was ich verstanden habe ist das scanf bei chars 1 ausgibt und bei int 0. Das Ret ist somit klar.
Bei Scanf wird die Nummer und ein Char gescannt. Also praktisch ist der Char für das Enter da. Nach nachforschen im Internet anscheinend dafür, dass bei der Scanf das Enter (\n) im Puffer gespeichert wird und somit man dann praktisch dieses abfängt. In der zweiten while wird dieser Puffer dann irgendwie gelöscht.

Dazu kurz die Frage wie die zweite while schleife genau den Puffer löscht oder falls ich das falsch verstanden haben wie es sonst funktioniert.

Danke für eure Mühe.
01/08/2017 18:55 .Scy#2
Naja, getchar() 'entfernt' den nächsten character aus dem buffer, falls also irgendwelche zeichen noch im buffer stehen ließt die while-schleife solange, bis es eben '\n' erreicht, was das ende der line bedeutet, somit ist der buffer danach leer.
01/08/2017 19:00 Mikesch01#3
Leichter wäre es so:
Code:
int lese_int() {
    int number = 0;
    printf("Bitte geben sie eine Nummer ein: ");
    scanf("%d", &number);
    fflush(stdin);

    return number;
}
01/08/2017 20:25 Jon'Irenic#4
Quote:
Originally Posted by .Scy View Post
Naja, getchar() 'entfernt' den nächsten character aus dem buffer, falls also irgendwelche zeichen noch im buffer stehen ließt die while-schleife solange, bis es eben '\n' erreicht, was das ende der line bedeutet, somit ist der buffer danach leer.
Aber getchar() steht doch in der While-Schleife somit als Abbruchbedingung. Ich versteh das praktisch nicht. Bedingung ist, dass c != \n ist UND getchar() != \n solange führe aus {}; = nichts??..

Das ist so der Punkt was ich nicht in den Kopf kriege ^^
01/09/2017 00:05 8BitThinker#5
Gebe als Beispiel folgende Eingabewerte ein: abc
erneute Eingabe: 123


Code:
// Test Platform
//#include <iostream>
#include <stdio.h>

int lese_int();
int main() {

	printf("%d", lese_int());
	return 0;
}

int lese_int() {
	int number = 0;
	int ret = 0;
	char c;
	printf("Bitte geben sie eine Nummer ein: ");
	while (ret == 0) {
		ret = scanf("%d%c", &number, &c);
		while (c != '\n' && getchar() != '\n') {};
		if (ret == 0)
			printf("\nDas war keine Nummer. Versuchen sie es erneut: ");
	}

	return number;
}
Nun versuchst dieselbe Eingabe mit:

Code:
#include <stdio.h>

int lese_int();
int main() {

	printf("%d", lese_int());
	return 0;
}

int lese_int() {
	int number = 0;
	int ret = 0;
	char c;
	printf("Bitte geben sie eine Nummer ein: ");
	while (ret == 0) {
		ret = scanf("%d%c", &number, &c);
		while (getchar() != '\n') {};
		if (ret == 0)
			printf("\nDas war keine Nummer. Versuchen sie es erneut: ");
	}

	return number;
}

Wenn du den kleinen Unterschied im Programm bemerkst, ist die Antwort, weshalb sich das Programm
so verhält, bei @[Only registered and activated users can see links. Click Here To Register...]
01/09/2017 07:23 florian0#6
Quote:
Originally Posted by Mikesch01 View Post
Leichter wäre es so:
Code:
int lese_int() {
    int number = 0;
    printf("Bitte geben sie eine Nummer ein: ");
    scanf("%d", &number);
    fflush(stdin);

    return number;
}
Achtung: Der Sinn von fflush ist, einen Ausgabebuffer einer Datei zu leeren, also den aktuellen Inhalt sicher in die Datei zu schreiben. Die Anwendung von fflush auf einen Eingabebuffer macht keinen Sinn. Wohin soll der verbleibende Input auch geschrieben werden?
Der einzige Grund, warum sich dieser Code durchgesetzt hat, ist Microsoft mit seiner standard-freien Kartoffel-Lib.

Bitte nicht!