Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 14:16

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Scanf nur Integers ausgeben lassen

Discussion on Scanf nur Integers ausgeben lassen within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
Jon'Irenic's Avatar
 
elite*gold: 176
Join Date: Mar 2009
Posts: 1,298
Received Thanks: 330
Scanf nur Integers ausgeben lassen

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.
Jon'Irenic is offline  
Old 01/08/2017, 18:55   #2
 
.Scy's Avatar
 
elite*gold: 15
Join Date: Jul 2010
Posts: 3,926
Received Thanks: 1,158
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.
.Scy is offline  
Old 01/08/2017, 19:00   #3
 
Mikesch01's Avatar
 
elite*gold: 203
Join Date: Sep 2007
Posts: 732
Received Thanks: 190
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;
}
Mikesch01 is offline  
Old 01/08/2017, 20:25   #4
 
Jon'Irenic's Avatar
 
elite*gold: 176
Join Date: Mar 2009
Posts: 1,298
Received Thanks: 330
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 ^^
Jon'Irenic is offline  
Old 01/09/2017, 00:05   #5
 
8BitThinker's Avatar
 
elite*gold: 0
Join Date: Jan 2017
Posts: 13
Received Thanks: 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 @
8BitThinker is offline  
Old 01/09/2017, 07:23   #6
 
elite*gold: 100
Join Date: Apr 2008
Posts: 860
Received Thanks: 1,464
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!
florian0 is offline  
Thanks
1 User
Reply


Similar Threads Similar Threads
[C++] Value auf Offsets und Basepointer ausgeben lassen
08/04/2016 - C/C++ - 4 Replies
Hey yo ihr Coder, folgendes: Ich habe die Offsets und den Basepointer, Statische Adresse, Base Adresse (was ich nicht alles heute schon als Bezeichnugn dafür gesehen habe) aus einem Spiel ausgelesen. DWORD Pointer = 0x041BDEC; DWORD Offset1 = 0xAC; DWORD Offset2 = 0x4C;
[C++] Immer aktuelle Uhrzeit ausgeben lassen
01/07/2015 - C/C++ - 13 Replies
Guten Tag liebe Coder, heute zum zweiten mal ich :) Ich habe ewig in der SuFu geschaut und nicht das gefunden was ich will, nun kommt mir die Frage ob es überhaupt möglich ist. Ich möchte das in einer Konsolenanwendung die aktuelle Zeit da steht. Ich möchte jedoch nicht das die Zeit da steht wenn ich Starte, sondern die Zeit soll ich immer automatisch jede Sekunde aktualisieren, wie eine normale Uhr eben. Ist das möglich und wenn ja wie?
MYSQL Anzahl der Datensätze ausgeben lassen
03/15/2014 - Web Development - 9 Replies
Hey, Vorerst danke für eure Hilfe! Dies ist mein derzeitiger Code. $test = $mysql_query("SELECT COUNT(*) FROM testies"); Und dann unten :
[C#] Nach Zeichenkette in String suchen und ausgeben lassen?
11/17/2012 - .NET Languages - 4 Replies
Moin, will in einer PictureBox den Captcha von der Google-Mail Registrierung anzeigen lassen. Natürlich ist das nicht einfach über eine ID oder den name aufrufbar, also muss ich hier ganz klar den Quelltext der Seite nach einer bestimmten Zeichenkette durchsuchen, die Position davon + oder - ein paar Stellen nehmen (da sich die URL zum Captcha ja immer ändert). Irgendwie will das so aber nicht ganz bei mir. Dass ich hier IndexOf() und SubString() brauche ist mir auch klar, ich bekomms aber...
[Java]Array vom Typ String > Inhalt ausgeben lassen
10/30/2012 - General Coding - 2 Replies
Ahoi epvp, String array= {"x", "y"}; Es handelt sich um diesen Array vom Typ String. Der befindet sich in Klasse "mitarbeiterSuche", allerdings will ich ihn in der Klasse "main" ausgeben. Woran kann das liegen? Eclipse sagt mir dauernd: "array cannot be resolved to a variable"



All times are GMT +1. The time now is 14:16.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.