» Eingabe von Dezimalzahlen verhindern

Programm geht sofort wegNeuen Thread eröffnenNeue Antwort erstellenbitoperationen in c
AutorNachricht
Beobachter 
Anmeldedatum: 14.11.2011
Beiträge: 1
14.11.2011, 19:57
zitieren

Hi an alle,

Bin Anfänger im Programmieren mit c und habe eine Frage zum Thema ungültige Eingaben.
Für mein Programm dürfen keine Dezimalzahlen eingelesen werden, da die Rechnung damit unsinnig wäre.

Meine Frage ist nun wie ich es ermögliche, dass für den Fall das jemand doch eine Dezimalzahl eingibt, das Programm eine Ausgabe in der Form:
"1,5 ist eine ungültige Eingabe" macht.

Das Programm soll danach automatisch wieder zur Eingabeaufforderung zurück kehren.


Ich bin dankbar für alle Antworten.

mfg Orpheus


pn
Junior 
Anmeldedatum: 03.05.2011
Beiträge: 77
15.11.2011, 16:20
zitieren

Du musst die Eingabe als String machen und dann den String untersuchen, ob er das gewünschte Format hat.
Wenn ja, kannst du den Eingabestring in das Format int oder float, je nachdem was verlangt wird wandeln.
Wenn nicht, kannst du eine entsprechende Fehlermeldung absetzen.


pn
Junior 
Name: Voller Name als Anagramm: Fitje Weshoms
Geschlecht:
Fahrzeug: Yamaha YZF R6 Thundercat
Anmeldedatum: 15.07.2012
Beiträge: 92
Wohnort: Amberg, Oberpfalz
19.01.2013, 19:50
zitieren

Vielleicht lesen ja noch andere Anfänger diesen Beitrag um Info's zu bekommen.
Möglicherweise kann man hier mit sogenannten Negativ-Listen bei scanf helfen.

Hier ein kleiner Überblick:

bei
scanf("%[^\n]", array);
werden alle Zeichen, auch das Leerzeichen außer das new line-Zeichen eingelesen
(Enter).

mit
scanf("%[0123456789abcdef]", array);
werden nur Zeichen, die innerhalb der Rechteckklammern stehen, eingelesen.

also wird mit
scanf("%[^0123456789,.\n]", array);
die Eingabe von Zahlen Dezimalzahlen verhindert, auch das Komma und der Punkt.
Beim ersten "unerwünschten Zeichen" wird die Eingabe in das Array abgebrochen
und ab diesen Zeichen alle weiteren Eingaben ignoriert.
Das Circonflexe zeigt uns also an, das es sich hier um eine
"Negativ-Liste" handelt.
Einfach mal ein Test-Proggi schreiben und ausprobieren.

Positiv-Liste:
scanf("%[0123456789+-*/=]", c_posi);
Wäre eine Positiv-Liste. Es werden nur die Zeichen eingelesen, die sich innerhalb der
Klammern befinden. Beim ersten anderen Zeichen Abbruch.
Der Ausdruck
scanf("%15[0123456789+-*/=]", c_posi);
würde Die Eingabe auf 15 Zeichen(Angabe hinter dem Prozentzeichen) begrenzen.


Beispiel:


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

void clpuf(void)
 {
 while (getc(stdin) != '\n')
    ;
 }

int main()
{
 int i;
 char c_posi[200] = {0};
 char c_nega[200] = {0};

  printf("Beispiel Positiv- und negativ Liste bei scanf\n");

 printf("\nPositiv-Liste:\n");
 printf("Bitte zum Test einen String\nMuster.....: 123430abc  \neingeben.\nEingabe:  ");

/** liest nur Zeichen ein die innerhalb der eckigen Klammern stehen
   * und beendet die Eingabe in  die Variable beim ersten Zeichen, das nicht
   * in der Liste steht*/

 i = scanf("%15[0123456789+-*/=]", c_posi);
 printf("Die Eingabe war: %s \ni=%d\n", c_posi, i);

 /** Beseitigt die restlichen im Tastaturpuffer stehenden Zeichen, da diese sonst
   * bei der naechsten Eingabe wieder verwendet werden */
 clpuf();

 printf("Negativ-Liste-Liste:\n");
 printf("Bitte zum Test einen String\nMuster.....: asdfgh123  \neingeben.\nEingabe:  ");
 i = scanf("%[^1234567890]", c_nega);
 printf("Die Eingabe war: %s \ni=%d\n", c_nega, i);

 clpuf(); /** Tastaturpuffer leeren*/

 printf("\nBitte zum Test einen String mit Leerzeichen eingeben\nEingabe:  ");
 /** liest alle Zeichen ausser den Newline-Zeichen(Enter-Taste) ein*/
 ///scanf("%21[^\n]", c_nega); ---> wäre eine Begrenzung auf 21 Zeichen beim einlesen
 scanf("%[^\n]", c_nega);
 printf("Die Eingabe war: %s \n\n", c_nega);

 printf("Das Programm wird nun beendet.....\n");
return EXIT_SUCCESS;
}


Würde im Beispiel bei der Negativ-Liste oder der Positiv-Liste nur Zeichen eingegeben
welche die Liste nicht akzeptiert, wäre der Rückgabewert von scanf 0.
Falls jedoch auch nur ein Zeichen akzeptiert wird, so wird dieses dem char.Array
zugewiesen und der Rückgabewert von scanf ist dann 1.


Literaturhinweise(mal im Aniquariat oder auf'n Flohmarkt stöbern):
Keine Angst vor dem Alter der Bücher, die meisten Grundlagen stimmen immer noch,
einige Bücher werden jetzt erweiterte und angepasste Auflagen vorhanden sein,
also nachfragen:

Gerhard Willms
Jahr: 1995
Titel: Das C Grundlagenbuch
Verlag Data Becker
ISBN 3-8158-1208-0


André Willms
Jahr 1997
Titel: C-Programmierung
Verlag ADDISON-WESLEY
ISBN 3-3-8273-1112-8


André Willms
Jahr 1997
Titel: C-Programmierung lernen
Verlag ADDISON-WESLEY
ISBN 3-8273-1405-4


André Willms
Jahr 1997
Titel: C++-Programmierung
Verlag ADDISON-WESLEY
ISBN 3-3-8273-1152-7

André Willms
Titel: C++-Programmierung lernen
Verlag ADDISON-WESLEY
ISBN 3-8273-1342-2

Dirk Louis
Titel: C/C++ Kompendium
Jahr 1998
Verlag Markt und Technik
ISBN 3-8272-5386-1

Stanley B. Lippman
Jahr 1991
Titel: C++ Einführung und Leitfaden
Verlag ADDISON-WESLEY
ISBN 3-89319-375-8

Kaare Christian
Titel: Programmierung mit C++
Verlag Microsoft Press
ISBN 3-86063-310-4

Schmidberger (Hrsg.), Schippert, Kölle, Urban Haberbosch Thülly
Jahr 1998
Titel: MFC mit Visual C++ 6.0
Verlag MITP
ISBN 3-8266-0458-X

Ulla Kirch-Prinz
Peter Prinz
3. Auflage 2005
Titel: C++ Lernen und professionell anwenden
Verlag MITP
ISBN 3-8266-1534-4

Helmut Erlenkötter
Titel: C++ Objektorientiertes Programmieren von Anfang an
Verlag rororo
ISBN 3-499-60077-3


Helmut Erlenkötter
Titel: C++ Objektorientiertes Programmieren für Windows
Jahr 2001
Verlag rororo
ISBN 3-499-61205-4

Bleßmann, Bütner, Dax
Titel: Anwendungsentwicklung
3.Auflage
Bildungsverlag Eins
ISBN 978-8237-1143-8

Jürgen Bayer
Jahr 2002
Titel: Programmieren lernen
Verlag ADDISON-WESLEY
ISBN 3-8273-1951-X

Stephen Rady Davis
Jahr 2005 4te Auflage
Titel C++ für Dummies
Verlag MITP
ISBN 3-8266-3151-x

Rainer Egewardt
2te überarbeitete Auflage
Titel: Das PC-Wissen für IT-Berufe
Verlag Vieweg
ISBN 3-358-15739-9

Gerd Siegmund
Titel:ATM - Die Technik
3te neubearbeitete und erweiterte Auflage
Verag Hüthig
ISBN 3-7785-2541-7

Auch für C/C++-Freunde lesenswert, da es viele Grundlagen der Programmierung
von Funktionen und Datentypen transparenter macht. Wie gesagt, es müssten für die
meisten Bücher erweiterte/Überarbeitete Auflagen zur Verfügung stehen, macht euch
im Antiquariat oder auf dem Flohmarkt zu schaffen. Die Grundlagen bleiben ja gleich.
Die Programme kann man ja eventuell in Virtual PC laufen lassen(einfach ausprobieren):

Christoph Klawun
Titel: Turbo Pascal 6.0
Verlag: Addison-Wesley
2te überarbeitete Auflage
ISBN 3-89319-374-X

R.Herschel / E.-W Dietrich
Titel: Turbo Pascal 6.0
Verlag: Oldenbourg Verlag München 1992
ISBN 3-486-21925-1

Wolfgang Link
Titel: Assembler Programmierung Eine gründliche Einführung
1995 Franzis-Verlag GmbH, 85586 Poing
ISBN 3-77238837-X

Michael Rohloff
Titel: easy Programmieren
Verlag: Markt und Technik
ISBN 3-8272-6134-1

Udo Müller
Titel: Java – Das Lehrbuch
Verlag: MITP
ISBN 3-8266-1333-3

Klaus Echtle / Michael Goedicke
Titel: Lehrbuch der Programmierung mit Java
Verlag: dpunkt
1te Auflage 2000
ISBN 3-932588-22-3

Jan Winkler
Titel: Ajax = JavaScripft + XML Für Schnelleinsteiger
Verlag: Franzis
Jahr 2007
ISBN 978-3-7723-7039-7


Kriegt jetzt von mir ja keinen falschen Eindruck, Bücher sind meine 2te Leidenschaft!
Gruß Guiseppe


 6x  bearbeitet
pn
Newbie 

Geschlecht:
Fahrzeug: Countach Quattrovalvole
Anmeldedatum: 27.12.2010
Beiträge: 17
26.01.2013, 23:12
zitieren

In der Praxis wird allgemein auf scanf() verzichtet, da es die Größe nicht ermittelt.

scanf("%[0123456789abcdef]", &array);
ist mit Vorsicht zu genießen, da man hier Überläufe erzeugen kann.
(Aber gut für schnelle Lösungen, kannte ich noch nicht)

Bessere Variante: mit
fgets(cArray, sizeof(cArray), stdin);
einlesen und danach mit
sscanf(cArray, "%i", &iArray);
in das entsprechende Format konvertieren.
Hat auch den Vorteil, dass leere Eingaben und Überläufe abgefangen werden.


 2x  bearbeitet
pn
Gast 
26.01.2013, 23:12
zitieren

Mach mit!

Wenn Dir die Beiträge zum Thread "Eingabe von Dezimalzahlen verhindern" gefallen haben oder Du noch Fragen hast oder Ergänzungen machen möchtest, solltest Du Dich gleich bei uns anmelden:



Registrierte Mitglieder genießen die folgenden Vorteile:
✔ kostenlose Mitgliedschaft
keine Werbung
✔ direkter Austausch mit Gleichgesinnten
✔ neue Fragen stellen oder Diskussionen starten
✔ schnelle Hilfe bei Problemen
✔ Bilder und Videos hochladen
✔ und vieles mehr...


Neuen Thread eröffnenNeue Antwort erstellen
Ähnliche BeiträgeRe:
Letzter Beitrag
Eingabe von bis zu 1000 Zahlen ?
Hallo Leute, Ich bin ein kompletter Neuling in der Programmierung und befasse mich damit seit ca. 1 Woche intensiv, und mir kommen da ein paar Fragen auf die ich mir durch Recherche bisher nicht beantworten konnte unzwar : Wie erstelle ich ein Programm...
[Java]von Padawan
0
432
10.03.2013, 22:06
Padawan
Rost verhindern wie lackieren?
Hi, ich soll nem kumpel nach dem parkrempler die stelle vor rost schützen. reicht es da wenn ich anschleife, füller, lack, klarlack fertig? soll keinerlei ästhetischen ansprüchen gerecht...
von Mr.Fister
6
358
05.11.2011, 11:32
DC2_driver
Wie kann ich Spam-Anmeldungen verhindern?
Mein Problem ist, dass ich permanent Spamanmeldungen habe, ich komme mit dem Zusammenführen und löschen gar nicht hinterher. Verstehe das nciht. Habe doch die Erweiterung Spamschutz drin, oder Antibot wie die heißt .....
von Metusalix
10
190
13.05.2015, 19:24
mgutt
Wie (falsches) setzen von Tieferlegungsfedern verhindern ???
Hab noname Tieferlegungsfedern 40/40 bei mir rumliegen, wenn ich diese jetzt einbauen lasse befürchte ich irgendwann ein Keiltieferlegung hinten Tiefer als vorn zu haben :wall: Was kann ich denn dagegen machen außer noch für hinten 30 federn zu...
von Darkstar-Z
14
1.810
02.05.2007, 10:58
skahead
Auspuffschrauben: Festgammeln/Kontaktkorrosion verhindern
Hallo Bei der Montage einer geschraubten catback ( Auspuffanlage) möchte ich punkto Schrauben nichts mehr das dahingammelt und auch wieder leicht zu öffnen ist... Sind Edelstahl Schrauben und Muttern zu empfehlen oder wären verkupferte Auspuffmuttern...
von christoph23
13
3.061
03.05.2016, 16:15
DERChristian
 Synology DNS Server einrichten um NAT Loopback zu verhindern
Wer so wie ich Probleme mit seinem Router hat, weil dieser beim NAT Loopback in die Knie geht, kann das umgehen, in dem er lokal einen DNS Server installiert und dessen IP in dem Router einträgt. Wir machen genau das mit einer Fritz!Box und einem...
Seite 2 [Allgemein]von mgutt
15
32.139
11.04.2014, 19:30
mgutt
Note 3 Tipp: WLAN Verbindungsabbruch verhindern
Immer wieder beschweren sich Note 3 Besitzer darüber, dass die WLAN Verbindung abbrechen würde. Dummerweise ist im Note 3 ein meiner Ansicht nach sinnloses Feature standardmäßig aktiv. Es nennt sich "Automatischer Netzwechsel". Diese Funktion...
von mgutt
0
1.314
14.10.2013, 19:39
mgutt
Verhindern das Unterstriche in Leerzeichen gewandelt werden?
Hallo leute wie kann ich im Wiki verhindern das Unterstriche "_" in Leerzeichen umgewandelt werden? Meine Absicht ist zum Beispiel den User : "ma_ro" anzumelden. Bis jetzt kommt da : "Ma ro" raus . Könnt ihr mir...
von bob393
1
394
14.02.2012, 16:11
Speedtook
Wasserflecken nach Autowäsche: Warum und wie verhindern?
Hallo, Titel sagt eigentlich alles. Ich hab nach dem Autowaschen an der Tanke immer so doofe Flecken wenn das Wasser getrocknet ist. Kann mir jemand sagen, wie die entstehen und wie ich das verhindern kann(mal abgesehen vom polieren nach dem...
von McKinley
6
5.609
01.10.2005, 20:40
liene
Windows 7: Neuer Ort in Bibliothek = Alle Orte als Liste, wie verhindern?
Ich nutze die Bibliotheken. Nun möchte ich wegen Platzmangel auf C (SSD) die Bilder, etc. auf der zweiten Festplatte ablegen. Also füge ich einen neuen Ort hinzu und mache den zum Standard. Allerdings ändert Windows dann die Darstellung so, dass ich die...
von mgutt
2
104
28.10.2014, 20:28
mgutt
© 2004 - 2025 www.programmierer-forum.de | Communities | Impressum |