Webmaster Forum Logo Part 1 Webmaster Forum Logo Part 2
Webmaster Forum Logo Part 3
     
 
  :: Anmeldung

Benutzername:

Registrierung...

Passwort:

Passwort vergessen?

angemeldet bleiben


  
  :: Umfrage
Welche sozialen Netzwerke benutzt du regelmäßig?

 Facebook
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 73%
 keines
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 22%
 Google+
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 19%
 Twitter
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 11%
 Xing
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 schülerVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 meinVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 studiVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 MySpace
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%
 LinkedIn
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%

 ges. 393 Stimmen
 
  :: Buttons

Valid XHTML 1.0 Transitional

Chenda

Routinier

Dabei seit: 03.02.2008

Beiträge: 334

 

1 Zum Seitenanfang

Dienstag, 17. März 2009, 11:42

c++ Abfrage ob eine Eingabe eine Zahl ist.

Hallo zusammen,

ich möchte, dass ein Benutzer über die Eingabeaufforderung eine Zahl eingibt.
Diese Eingaben sollen auf Korrektheit geprüft werden (enthält die Eingabe Buchstaben oder Sonderzeichen?)

Es läuft leider nicht so, wie ich mir das vorgestellt habe. Wird eine Zahl eingegeben ist alles ok. Wird ein Buchstabe eingegeben funktioniert auch die Fehlerausgabe. Ein Problem tritt aber dann auf, wenn eine Zahl gefolgt von einem oder mehreren Buchstaben eingegeben wird. Dann verwendet das Programm die Zahl als Eingabe, übergibt aber die Buchstaben ebenfalls und erzeugt in der zweiten Instanz in der wieder eine Zahleneingabe erfolgen soll automatisch einen Fehler aufgrund der Buchstaben. Bei der zweiten Instanz wird die Eingabe übersprungen und leider gleich die Buchstaben, die vorher mal eingegeben wurden, verwendet.

Wo ist der Haken?

C/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<iostream>
#include<cmath>
#include<string>
#include<ctype.h>
#include<limits>
#include<list>
#include<vector>
#include<algorithm>
#include<stdlib.h>

using namespace std;
//im folgenden die problematische Funktion:

int menu(int *eingabe)
{
do
	{
		cout<<"\n#### Hauptmenü ####\nBitte treffen Sie jetzt Ihre Auwahl (Hilfe = 0): ";
		if(cin>>*eingabe)
		break;
		else if(!cin.bad())
			{
				cerr<<"Sie haben einen ungültigen Wert eingegeben.\n";
				cin.clear();
				cin.ignore(std::numeric_limits<streamsize>::max(),'\n'); 
			}
	}
	while(cin);
}

int main()
{
	//header
	int eingabe=0;
	menu(&eingabe);
}
danke fürs Lesen
Alludo Animali

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Chenda« (17. März 2009, 14:10)

 

Matte

Tripel-As

Dabei seit: 01.01.2009

Beiträge: 154

 

2 Zum Seitenanfang

Dienstag, 17. März 2009, 16:41

hi,

ich habe eine ähnliche Aufgabe in einer Studienarbeit gehabt. Hab es aber mit C gelöst, was aber auch in c++ funktionieren müsste. Hab des ganze halt mit getche() gelöst und jeden einzelnen Buchstaben geprüft und dann in einen String gespeichert. Wenn er ne falsche Eingabe gemacht hat, kam dann eben eine Fehlermeldung.


hier ein Beispiel wie die Schleifen angeordnet werden müssen:


C/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
int txtcntr=0;
char txt[60];
int ERROR=1; 


while(ERROR != 0)
{
ERROR = 0;
fflush(stdin);
while(txt[txtcntr] != '#' && txtcntr < 60 && ERROR == 0)
   {
  	txt[txtcntr]=getche();  
  	if ((txt[txtcntr] >= 'A' && txt[txtcntr] <= 'Z') || (txt[txtcntr] >= 'a' && txt[txtcntr] <= 'z')
     	|| txt[txtcntr] == ' ' || txt[txtcntr] == ',' || txt[txtcntr] == '.' || txt[txtcntr] == '!' 
     	|| txt[txtcntr] == '?' || txt[txtcntr] == '#' || txt[txtcntr] == 13 || txt[txtcntr] == 8) {
     	if ((txt[txtcntr] >= 'A' && txt[txtcntr] <= 'Z') || (txt[txtcntr] >= 'a' && txt[txtcntr] <= 'z') 
        	|| txt[txtcntr] == ' ' || txt[txtcntr] == ',' || txt[txtcntr] == '.' || txt[txtcntr] == '!' 
        	|| txt[txtcntr] == '?' || txt[txtcntr] == 8) {
           	if (txt[txtcntr] == 8){
              	txtcntr--;
              	txtcntr--;
           	}
           	txtcntr++;
     	}
  	}
  	else {
    	ERROR = 1;
    	printf("\nERROR - falsche Zeichen bei Texteingabe verwendet\n");
    	printf("\nGeben Sie den Text erneut ein:\n\n");
  	}
   }

}





edit:

achja, du hast die zahlen dann natürlich hintereinander in einem string drin, wenn du die dann als int wert in einem angeben willst, musst du natürlich mit einem counter solange die hunderter zehner und einer potenzen (etc) hochzählen bis der counter die erwünschte zahl erreicht hat!


ps: das is reinstes Horner Schema, so wie ichs gelernt bekommen hab! es geht bestimmt auch schneller und ich würd mich freuen wenn jemand ein Beispiel angeben würde :)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Matte« (17. März 2009, 16:45)

 

Chenda

Routinier

Dabei seit: 03.02.2008

Beiträge: 334

 

3 Zum Seitenanfang

Mittwoch, 18. März 2009, 09:46

Hi Matte,

vielen Dank für deinen Lösungsvorschlag. Ich möchte den allerdings nicht verwenden.

Vielleicht formuliere ich mein Problem / Fragestellung um:
Wie verhindere ich, dass mein Programm bei Eingabe von z.B. "4dr" die "4" als korrekte Eingabe interpretiert (wird als int gespeichert) und weitermacht bis zur nächsten Eingabeaufforderung mittels cin wo dann automatisch die Buchstaben "dr" aus dem Pufferspeicher eingefügt werden.
Nochmal anders formuliert: Ich möchte, dass bei einer solchen Eingabe eine Meldung ausgeben in der Art: "Ihre Eingabe war 3, korrekt oder nochmal eingeben?" und dass der Pufferspeicher oder wo auch immer der Rest (dr) landet gelöscht wird und somit bei der nächsten Eingabeaufforderung auch auf eine Benutzereingabe gewartet wird.


EDIT:
Ich habe das jetzt insoweit verändert, dass er bei einer Eingabe, die außer Ziffern noch Buchstaben enthält, alles ab dem 1. Buchstaben abschneidet. Allerdings habe ich es nicht hinbekommen, dass das Programm auf solch eine fehlerhafte Eingabe eine spezielle Reaktion liefert.


C/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<iostream>
#include<cmath>
#include<string>
#include<ctype.h>
#include<limits>
#include<list>
#include<vector>
#include<algorithm>
#include<stdlib.h>

using namespace std;
//im folgenden die problematische Funktion:

int menu(int *eingabe) 
{
	do
	{
		cout<<"\n#### Hauptmenü ####\nBitte treffen Sie jetzt Ihre Auswahl (Hilfe = 0): ";
		if(cin>>*eingabe)
		{
			cin.clear();
			cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
			break;
		}
		else if(!cin.bad())
			{
				cerr<<"Sie haben einen ungültigen Wert eingegeben.\n";
				cin.clear();
				cin.ignore(std::numeric_limits<streamsize>::max(),'\n'); 
			}
	}
	while(cin);
}


Wie kann ich noch eine Abfrage einbauen, dass bei einer Eingabe von z.B. 1m eine Reaktion darauf kommt. So wie das mom. ist liefert das Programm sowohl bei Eingabe von 1m als auch von 1 das gleiche Ergebnis.
danke fürs Lesen
Alludo Animali

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Chenda« (18. März 2009, 13:46)

 

Matte

Tripel-As

Dabei seit: 01.01.2009

Beiträge: 154

 

4 Zum Seitenanfang

Mittwoch, 18. März 2009, 18:55

also um den pufferspeicher zu löschen und das was überflüssig drin steht, habe ich das

C/C++-Quelltext

1
fflush(stdin);


benutzt, denn das is nämlich der befehl dafür!
 

Chenda

Routinier

Dabei seit: 03.02.2008

Beiträge: 334

 

5 Zum Seitenanfang

Donnerstag, 19. März 2009, 07:18

Hi Matte, aber damit bekomme ich doch nicht raus ob noch was drin stand, sondern lösche nur den Rest, oder?
danke fürs Lesen
Alludo Animali
 

Matte

Tripel-As

Dabei seit: 01.01.2009

Beiträge: 154

 

6 Zum Seitenanfang

Samstag, 21. März 2009, 21:19

yep, aber damit is schon mal ein teilproblem gelöst :)

warum willst du überhaupt wissen was der user noch eingegeben hat? es reicht doch zu wissen, dass er falsche eingaben gemacht hat und ihm zu fragen was er mit der eingabe anstellen will.

ich kenn mich leider nich mit cin aus, aber ich finde eine angemessene lösung mit einer Schleife und getche() würde denn zweck doch auch erfüllen. damit kannst du jeden Buchstaben und jede Ziffer per ASCII Tabelle nachvollziehen.

und in dem Array steht dann Buchstabe für Buchstabe.
 

Ähnliche Themen