Tastatureingabe überprüfen (Float-Zahl)
-
Hallo Leute,
wie kann ich eine Tastatureingabe auf Korrektheit überprüfen? Abgefragt werden soll eine Float-Zahl (mit Punkt als Dezimaltrennzeichen), es sollen keine anderen Zeichen außer 0-9 und Punkt zugelassen werden.
Wenn ich die Zahl als String einlese, kann ich zwar nach illegalen Zeichen suchen, die Zahl aber anschließend nicht mehr in eine Float-Zahl umwandeln (nötig für weitere Berechnungen). Jemand eine Idee?mfg.
Thomas
-
Katho80 schrieb:
die Zahl aber anschließend nicht mehr in eine Float-Zahl umwandeln
Dann speicher die Zahl doch in eine float Variable die du später wieder verwenden kannst :
float fNum = 2.15; CString strNum; strNum.Format("%f", fNum); if(strNum.FindOneOf(".") == 2) { // [...] } // Jetzt kannst du hier wieder fNum verwenden... // fNum + 3.15
Gruß
:: NoName ::
-
Hallo,
dein Code sieht gut aus, nur beim Versuch, den einzubinden, geht einiges schief.
Zunächst mal musste ich herausfinden, dass ich dafür die afx.h mit includen muss. Soweit, so gut. Aber wenn ich die mit einbinde, bekomme ich folgende Fehlermeldung:
--------------------Configuration: bremsweg - Win32 Debug--------------------
Linking...
LINK : fatal error LNK1104: cannot open file "nafxcwd.lib"
Error executing link.exe.bremsweg.exe - 1 error(s), 0 warning(s)
Dann wieder Google bemüht, und siehe da, ich soll MFC einschalten. Gesagt, getan. Doch dann wirds richtig bunt mit Fehlermeldungen, weil sich dann die conio.h und die graphics.h, die ich beide unbedingt brauche, in die Quere kommen:
--------------------Configuration: bremsweg - Win32 Debug--------------------
Compiling...
bremsweg.cpp
d:\programme\microsoft visual studio\vc98\include\conio.h(96) : error C2375: 'getch' : redefinition; different linkage
d:\eigene dateien\fht esslingen\fahrzeugtechnik\ti2\projekt\grafik\graphics.h(278) : see declaration of 'getch'
d:\programme\microsoft visual studio\vc98\include\conio.h(98) : error C2375: 'kbhit' : redefinition; different linkage
d:\eigene dateien\fht esslingen\fahrzeugtechnik\ti2\projekt\grafik\graphics.h(279) : see declaration of 'kbhit'
Error executing cl.exe.bremsweg.obj - 2 error(s), 0 warning(s)
Weitere Ideen?
Gruß Thomas
-
Naja, wir sind hier ja in einem MFC Forum. Du solltest schon MFC verwenden...
Hmm, schau mal auf deine Fehlermeldungen, die haben nix mit meinem Code zu tun'getch' : redefinition; different linkage
see declaration of 'getch''kbhit' : redefinition; different linkage
see declaration of 'kbhit'Das hat was mit 'getch' und 'kbhit' zu tun...
Gruß
:: NoName ::
-
Ich weiss,
das liegt meiner Meinung nach daran, dass die Funktion getch() zweimal deklariert ist, einmal in der conio.h und einmal in der graphics.h, die ich beide includet hab. Ich brauch aber beide Header-Files.
Was mich allerdings wundert: Warum tauchen die Konflikte nur dann auf, wenn ich die MFC's aktiviere? Wenn sie deaktiviert sind, wird mein Programm problemlos compiliert und gelinkt, mit aktivierten MFC's nicht.
Gibts nicht 'ne einfachere Möglichkeit, eine Tastatureingabe daraufhin zu überprüfen, ob eine Float-Zahl eingegeben wurde? Ich hab schon Funktionen gesehen wie isnum() oder isdigit(), nur kommen die halt nicht mit einem Dezimaltrennpunkt zurecht, oder? Gibts keine Funktion isfloat() oder sowas?
Gruß Thomas
-
Hmm, isdigit() fragt ja nur ein integer ab, kein float.
Du könntest dir nur eine eigene Funktion zusammenbasteln...Gruß
:: NoName ::
-
Schon, aber dann hab ich immer noch das Problem, dass ich meine eingelesene Zahl erst von Float in String umwandeln muss, damit ich irgendwas damit anstellen kann. Ich bekomme aber immer die Fehlermeldung "Cannot convert from float to char". Gibt es keine Funktion FloatToStr oder so was ähnliches?
Gruß Thomas
-
Katho80 schrieb:
Gibt es keine Funktion FloatToStr oder so was ähnliches?
Hmm, ne sowas kenne ich nicht...
Aber du brauchst doch eigentlich nur deine Zahl in ein String umwandeln und dann mit CString::Find() den Punkt '.' suchen. Wenn der gefunden ist weißt schon mal das es eine Dezimalzahl ist.float fNum = 2.25; CString strNum; strNum.Format("%fl", fNum); for(int i = 0; i < 10; i++) { if(strNum.Find('.') == i) { // AfxMessageBox("Es wurde ein Punkt gefunden !"); } }
Vielleicht solltest du noch prüfen ob Zahlen enthalten sind...
Gruß
:: NoName ::
-
Ich glaube, wir reden gerade etwas aneinander vorbei.
Dein Vorschlag mit CString hab ich ja schon versucht, nur brauch ich dafür die afx.h, die wiederum MFC's voraussetzt, welche bei mir zu genannten Kompatibilitätsproblemen führt.
Brauch ich unbedingt CString's? Oder geht das auch mit einer normalen String-Variable?Gruß Thomas
-
Hmm, also wenn du mit einer Konsolen Anwendung etc. arbeitest kann ich dir leider nicht helfen...
Vielleicht solltest du mal hier nachfragen, (C/C++ Rubrik)
http://www.c-plusplus.net/forum/viewforum.php?f=15Gruß
:: NoName ::
-
Vielleicht geht ja auch der andere Weg:
Die Float-Zahl von vorn herein als String einlesen, überprüfen, und anschließend in eine Float-Zahl umwandeln. Geht das irgendwie? Hab halt bisher keine Funktion gefunden, mit der man Strings in Floatzahlen umwandeln kann.
Es gibt doch die Funktion StrToInt(), die könnte man zumindest bis zum Punkt anwenden, und für den Teil nach dem Punkt. Nur wie setz' ich die beiden Teile dann wieder zusammen? Wenn man die Anzahl Nachkommastellen abschneiden würde, könnte man den Teil hinter dem Komma in eine int-Zahl umwandeln, durch z.B. 100 (für zwei Nachkommastellen) teilen, und zum vorderen Teil addieren. Wär' das machbar?Gruß Thomas
-
katho80 schrieb:
Die Float-Zahl von vorn herein als String einlesen, überprüfen, und anschließend in eine Float-Zahl umwandeln. Geht das irgendwie?
Das könntest du mit atof() machen
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_atof.2c_.atoi.2c_._atoi64.2c_.atol.aspHmm, wie man die Strings in C++ trennt und wieder zusammenfügt weiß ich leider nicht..
Gruß
:: NoName ::