|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Zyrian Super JLI'ler
Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 30.08.2003, 17:32 Titel: Zahl, oder nicht? |
|
|
Also, ich hab die MSDN auf und ab gesucht und rumgegoogelt wie blöd.
Meine Frage: Mit welcher Funktion (und in welchem Header ist sie definiert) kann man prüfen, ob eine Variable eine Zahl ist, oder nicht?
ne blöde Frage, aber ich weiß es einfach nicht ^^
mfg
C. _________________ Schau mir in die Augen, Kleines. |
|
Nach oben |
|
|
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 30.08.2003, 17:51 Titel: |
|
|
hm, meinst du, wie man den typ einer variablen abfragen kann
oder meinst du, wie du überprüfen kannst ob ein zeichen aus einem string
eine zahl ist?
wenn du letzteres meinst dann such mal in der MSDN nach "isdigit". |
|
Nach oben |
|
|
Zyrian Super JLI'ler
Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 30.08.2003, 18:03 Titel: |
|
|
ich habe in einem Konsolenprogramm eine Eingabeaufforderung mit cin gemacht. es soll ein Integer eingelesen werden (es handelt sich um eine Altersangabe). wenn dort stattdessen ein Buchstabe etc. eingegeben wird, steckt in der Schleife fest, in der die eben genannte cin eingabe stattfindet. diese schleife läuft solange, bis der benutzer -1 bei dem cin eingibt. und bei einem buchstaben läuft die schleife endlos weiter, ohne auf die eingabe des benutzers zu warten.
deshalb wollte ich vorher prüfen, ob das Eingegebene auch wirklich eine Zahl ist und kein Buchstabe.
in der msdn steht, dass ein boolscher wert bei isdigit zurückgegeben wird
ich hab also vorher schon das folgende probiert: if(isdigit(Alter) == false)
dann kommt aber die fehlermeldung, dass der linke wert ein L-Wert sein muss und so was. andersrum funktioniert es auch nicht...
mfg
C. _________________ Schau mir in die Augen, Kleines. |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 30.08.2003, 18:09 Titel: |
|
|
Ich würde einfach den eingelesenen String nehmen, und ihn zeichen für Zeichen überprüfen, ob es die Ziffer 0-9 ist.
Irgendwie verstehe ich die Funktion isdigit nicht. _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 30.08.2003, 18:20 Titel: |
|
|
Gugg dir mal die Funktion _ismbcdigit an. Du übergibst ihr einen char und sie gibt true zurück, wenn es eine '0' - '9' ist. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
Zyrian Super JLI'ler
Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 30.08.2003, 19:17 Titel: |
|
|
Hmm, kann man damit nur zahlen von 0-9 prüfen?
wie siehts mit 2-stelligen zahlen aus?
Anders könnte man das ja lösen, indem man das eingegebene Alter auf seinen Typen prüft, also ob es ein Integer ist etc. Wie würde denn das gehen?
mfg
C. _________________ Schau mir in die Augen, Kleines. |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 30.08.2003, 19:19 Titel: |
|
|
Du brauchst doch nur string[0]...string[n] überprüfen, nicht alles auf einmal. Wenn einmal "false" rauskommt, kannst du abbrechen. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 30.08.2003, 19:51 Titel: |
|
|
Als Ergänzung noch isdigit() |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 30.08.2003, 20:23 Titel: |
|
|
Mach das ganze doch mit atoi(). Das sollte dann bei nicht gelingen einen speziellen Fehlerwert zurückgeben _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
Zyrian Super JLI'ler
Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 30.08.2003, 21:13 Titel: |
|
|
Das alles bezieht sich jetzt auf die Behandlung eines Strings.
Momentan lese ich mit cin eine Integervariable ein. Muss ich jetzt wirklich den ganzen Code nach den Verwendungen der Integervariable suchen und die dementsprechend auf einen String umstellen, damit ich Funktionen wie atoi() benutzen kann? Die Funktion atoi() konvertiert laut MSDN einen String in einen Integer.
Wenn ich das Eingegebene Stück für Stück untersuchen und jedes mit isdigit() untersuchen will, muss ich dafür doch ein char-Array bzw String verwenden. Oder kann ich das ganze Umgeschreibe durch ein Integer-Array umgehen, das ich Element für Element checken kann? _________________ Schau mir in die Augen, Kleines. |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 30.08.2003, 22:16 Titel: |
|
|
Wenn du es dir wirklich so umständlich machen willst dann mache das so:
Code: |
int a=IrgendEineZahlDieNieEingegebenWerdenDarf;
cin>>a;
if(a==IrgendEineZahlDieNieEingegebenWerdenDarf)
{
cout<<"BENUTZ NE ANDERE LÖSUNG ANSTATT DAS HIER !!!\n";
}
|
Du bekommst also wenn du einige Buchstaben anstatt einer Zahl eingibts den alten Wert von a wieder. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 31.08.2003, 11:55 Titel: |
|
|
AFAIK funzt atoi() mit einem ganz normalen char-pointer. Das müsste dann so aussehen:
Code: | char* variable;
cout<<"Bitte Zahl eingeben: ";
cin>>variable;
if(atoi(variable)==fehlerwert)
{
cout<<"Falsche Eingabe";
return;
} |
_________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
Zyrian Super JLI'ler
Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 31.08.2003, 18:02 Titel: |
|
|
Ok.
Die Methode vom LoP funktioniert bei mir nicht, weil der Compiler meckert: warning C4700: Lokale Variable 'variable' wurde ohne Initialisierung verwendet
Auch nach einer vorherigen Initialierung der Variablen, kommt eine Windowsfehlermeldung. "Die Anweisung in blablabla verweist auf Speicher diesunddas. Der Vorgang written konnte nicht ausgeführt werden etc."
Die Möglichkeit von FallenAngel erscheint mir keineswegs umständlich. In einem kleinen Testprogramm leistete sie genau das, was ich brauchte. Thx dafür!
In meinem Hauptprogramm verwende ich allerdings eine Schleife, die nicht mehr ausgeführt werden soll, wenn das Alter -1 beträgt (bekannt aus dem ersten Buch ).
Wird für Alter ein ungültiger Wert angegeben, der nicht zu einem Integer passt, dann läuft das Programm quasi in einer Endlosschleife und sämtliche cin Anweisungen werden übersprungen (seltsamerweise nur diese, denn die Ausgabe und die restlichen Operationen funktioneren wie gehabt, wie ich an der überschnellen Ausgabe sehen kann), da Alter ja nicht -1 ist. Das Programm versäumt aber, mit den anderen cin Anweisungen Alter einen neuen und möglicherweise auch gültigen Wert zuweisen zu lassen.
Ich erwarte weniger eine komplette Lösung des Problems, mehr würde mich interessieren, warum alle cin Anweisungen übersprungen werden, nur weil ein mal für einen Integer ein Buchstabe oder so was eingegeben wurde.
MFG
Chris _________________ Schau mir in die Augen, Kleines. |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 31.08.2003, 20:18 Titel: |
|
|
Zyrian hat Folgendes geschrieben: | Ok.
Die Methode vom LoP funktioniert bei mir nicht, weil der Compiler meckert: warning C4700: Lokale Variable 'variable' wurde ohne Initialisierung verwendet
|
Ups, sry
Wenn du statt
Code: | char variable[256]; |
schreibst, sollte es eigentlich funktionieren. _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
Zyrian Super JLI'ler
Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 01.09.2003, 02:22 Titel: |
|
|
Gut, im Prinzip funktionierts dann.
Da ich aber so ein Kerl bin der wirklich nicht den geringsten Bug in seinen Programmen haben will (auch wenns nur Übungsprogs sind, wie das aktuelle Beispiel; je früher man Bugs vermeidet, desto einfacher fällt es einem für spätere Programme), ist diese Lösung nicht ganz zufriedenstellend.
Die erprobten Resultate des Programms mit dem char-Array sahen so aus:
Bei Eingabe von einer Zahl -> alles OK, Programm läuft weiter, Ausgabe klappt.
Bei Eingabe von Buchstaben -> alles OK, Programm wird gestoppt
Bei Eingabe von Buchstaben, gefolgt von Zahlen -> alles OK, wird gestoppt
Bei Eingabe von Zahlen, gefolgt von Buchstaben -> nicht OK, da das Programm weiterläuft und in der Ausgabe die Zahlen mitsamt den Buchstaben vorhanden sind.
Die Lösung vom gefallenen Engel war eigentlich super. Aber das konkrete Problem dabei zeigt sich in meinem letzten Post.
MFG
Chris _________________ Schau mir in die Augen, Kleines. |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|