WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Falsche Eingaben abfangen (c) (http://www.wcm.at/forum/showthread.php?t=58199)

S@ndy 31.05.2002 15:17

Falsche Eingaben abfangen (c)
 
hallo,

habe eine frage bezüglich abfangen falscher usereingaben
mein proggi soll nur einige berechnungen zu würfel durchführen
es funktioniert auch schon (wenn der user alles richtig eingibt)
mein problem liegt jetzt noch bei der usereingabe
wenn man nämlich statt einer zahl einen buchstaben eingibt hängt sich das proggi auf

wie kann ich nun den user zur erneuten eingabe auffordern wenn ein buchstabe oder sonderzeichen eingegeben wurde?

danke
lg
s@ndy

**********************************************
int einlesen()

{
int v_seite_1_a, v_seite_1_b, v_seite_1_c, v_seite_2_a, v_seite_2_b, v_seite_2_c;


printf ("\nBitte geben sie die 1 Seite der 1 Schachtel ein: ");
scanf ("%u", &v_seite_1_a);
printf ("\nBitte geben sie die 2 Seite der 1 Schachtel ein: ");
scanf ("%u", &v_seite_1_b);
printf ("\nBitte geben sie die 3 Seite der 1 Schachtel ein: ");
scanf ("%u", &v_seite_1_c);



printf ("\nBitte geben sie die 1 Seite der 2 Schachtel ein: ");
scanf ("%u", &v_seite_2_a);
printf ("\nBitte geben sie die 2 Seite der 2 Schachtel ein: ");
scanf ("%u", &v_seite_2_b);
printf ("\nBitte geben sie die 3 Seite der 2 Schachtel ein: ");
scanf ("%u", &v_seite_2_c);

ordnen (v_seite_1_a, v_seite_1_b, v_seite_1_c, v_seite_2_a, v_seite_2_b, v_seite_2_c);
}

wizo 31.05.2002 16:34

mit scanf kannst du definitv nix abfangen daß ist in c leider so
aber wenn du die zeichen mit getch() einliest
dann kannst du den wert speichern auswerten ob er gültig ist und zu einer wiederholten eingabe auffordern

Stona 31.05.2002 17:35

wieso nicht mit einer normalen "if-Abfrage"?

if (v_seite_1_c != 1 || 2....)

{
printf("Error");
exit (0);
}

else

ordnen (v_seite_1_a, v_seite_1_b, v_seite_1_c, v_seite_2_a, v_seite_2_b, v_seite_2_c);

PredeX 01.06.2002 00:39

@Stona:
sehr elegant... und es sollte auch nicht funktionieren

Das Problem is die Umwandlung von dem Zeichen (bsp.: A) in unsigned, ich habe das jetzt ausgetestet welche Zahlen das ergibt, und es ist fix nicht richtig. BSP: ich geb A ein und herauskommt 4246062 od so irgendwas, wenns ichs dann mit printf ausgeben lassen. Eine weitere möglichkeit ist dass es am Return liegt, womit scanf beendet wird. Aber ich bin jetzt zu müde um mir da jetzt weiter den kopf zu zerbrechen...
:o
PredeX

PredeX 01.06.2002 00:41

könntest du vielleicht mal den ganzen code posten, ich möcht ma das nur mal als ein ganzes ansehen... vielleicht bringt mich das auf eine idee... wer weiß...

PredeX

PS: irgenwie lässt mich das nicht in ruh ;)

S@ndy 01.06.2002 09:12

Code
 
sicher kann ich den ganzen code posten...

glaubt ihr geht es mit ascii_seite_a = toascii (seite_a);
aber wie macht man das wenn man eine zweistellige zahl eingeibt? :-(


danke lg
s@andy

ps. code hängt dran - rein kopieren würde über die max. länge raus gehen...

PredeX 01.06.2002 12:46

Wenn du das ganze mit atoi(=alphanumerische zu Int) dann müsstes du das ganze mit einer while/for schleife realisieren, wobei das
abbruchskriterium die Eingabe von der return-taste ist, glaub ich...
Bsp

Code:

int input()
{
  char char_Eingabe[];
  int  int_Eingabe[];
  int index, zahl;

  for(index=0; index<=10; ++index)
  { 
    char_Eingabe[index]=getche();
   
    if(char_Eingabe[index]>='0' && char_Eingabe[index]<='9')
    {
      int_Eingabe[index]=atoi(char_Eingabe[index]);
    }//end if
    else if(char_Eingabe[index]=13) //13=Return Taste
        break;
    else
    {
      error_code=1;
      break;
    }//end else
  }//end for()
 
if(error_code!=1)
{
  zahl=input2zahl(int_eingabe[],strlen(int_eingabe[])-3);
}
else /*Hier muss man sich jetzt noch was sinnvolles überlegen, sodass
dann das gesamte Programm entweder neustartet od. überhaupt beendet wird.
Das einfachste wäre vielleicht mit exit, wodurch das Programm einfach
abgebrochen wird...
*Correct me if if i'm wrong* */

return zahl;
}


int input2zahl(string[],length)
//wenns mit string[] ned funzt, probiers mal mit einem Pointer
{
  int index;
  int zahl=0;
  int exp=length;

  for(index=0;index<=length;++index,--exp)
  {
    number=string[index]
    zahl= (int)(zahl + pow((double)number,(double)exp));
    //fuer pow() brauchst du math.h, pow(double x, double y)=> x^y
  }
  return zahl;
}

So das is jetzt ein bissl kompliziert worden, mir is aba nix besseres eingfallen, würd mich freuen, wenns sich andere das auch noch genauer anschaun zwecks Verbesserungen. Wenns fragen zum Sourcecode gibt, postet einfach, ich hab nur jetzt keine Zeit mehr ghabt das alles ausführlich zu dokumentieren...

Aja und getestet hab ichs auch ned, kann also sehr fehlerhaft sein, wenn ich was übersehen hab :D

PredeX

S@ndy 01.06.2002 13:44

Es geht doch - sogar einfach
 
Hallo,

hab ein wenig herum gesucht im netz und meine bücher durchsucht und bin jetzt auf nen grünen zweig gekommen
es funktioniert eigentlich ganz einfach *G*

do
{
flushall();
printf ("\nBitte geben sie die 1 Seite der 1 Schachtel ein: ");
v_stat = scanf ("%f", &v_seite_1_a);
p_seite_1_a = v_seite_1_a;
if (v_stat != 1 || v_seite_1_a <= 0.0)
{
printf ("Ungültige Eingabe...(Komma muss . sein!)\n");
}
} while (v_stat != 1 || v_seite_1_a <= 0.0);


könnt mir vielleicht noch jemand erklären warum bei float eingabe ein 9,9 (also mit , nicht mit .) erlaubt ist und bei 0,5 regt er sich auf da muss man 0.5 eingeben??!!?? das hab ich net verstanden

lg
S@ndy :)

ps. langsam wirds was mitn programmieren in c und cpp und es macht mir immer mehr spaß (ich meine c / cpp programmierung - in der arbeit programmier ich eh tag täglich mit ner andren sprache )

PredeX 01.06.2002 15:49

kleiner Fehler
 
[edit]: vergesst dieses Post, skippt weiter zum nächsten...
[edit2]: vergesst es doch nicht ganz, denn der source erklärt so
ungefähr wie atoi anscheinend funzt. Sollte das sandy nicht
interessieren, dann ließ nach dem Sourcecode weiter...

Code:

int input()
{
  char char_Eingabe[];
  int  int_Eingabe[];
  int index, zahl;

  for(index=0; index<=10; ++index)
  {
    char_Eingabe[index]=getche();
 
    if(char_Eingabe[index]>='0' && char_Eingabe[index]<='9')
    {
      int_Eingabe[index]=atoi(char_Eingabe[index]);
    }//end if
    else if(char_Eingabe[index]=13) //13=Return Taste
        break;
    else
    {
      error_code=1;
      break;
    }//end else
  }//end for()
 
if(error_code!=1)
{
  zahl=input2zahl(int_eingabe[],strlen(int_eingabe[])-3);
}
else /*Hier muss man sich jetzt noch was sinnvolles überlegen, sodass
dann das gesamte Programm entweder neustartet od. überhaupt beendet wird.
Das einfachste wäre vielleicht mit exit, wodurch das Programm einfach
abgebrochen wird...
*Correct me if if i'm wrong* */

return zahl;
}


int input2zahl(string[],length)
//wenns mit string[] ned funzt, probiers mal mit einem Pointer
{
  int index;
  int zahl=0;
  int exp=length;

  for(index=0;index<=length;++index,--exp)
  {
    number=string[index]
    zahl= (int)(zahl + number*(pow(10.0,(double)exp));//<--hier war ein Fehler
    //fuer pow() brauchst du math.h, pow(double x, double y)=> x^y
  }
  return zahl;
}

@sandy:
Also deine Abfrage schließt jetzt aus dass die Float bzw double Zahlen
falsch eingegeben wurden, während meine nicht mit float bzw. double
Zahlen umgehen kann sondern nur mit int werten. Meine Variante schließt -so glaub ichs zumindestens- schließt die eingabe von
Zahlen, die verschieden von 0-9 sind mit Sicherheit aus und bricht ab.

PredeX

PredeX 01.06.2002 16:00

Und jetzt bin ich grad draufkommen dass es noch viel leichter geht und ich wieder mal viel zu kompliziert gedacht habe...
wenn du den Eingabestring einfach mit atoi oder atof (alphanumeric to float) umwandelst kann dir die user eingabe eingentlich egal sein, denn atof wandelt folgenden string " -123.1AVD" in die Zahl -123.1 um. auch atoi wandelt einen String " +123tEg" in +123 um. eigentlich ganz praktisch...

Wennst jetzt trotzdem den user daraufhinweisen willst dass er eine falsche eingabe getätigt hat dann weist du ihn einfach mit einer if abfrage
Code:

if(eingabe[index]<'0' && eingabe[index]<'9')
  printf("Das %d.Zeichen der Eingae ist %c und somit kein numerischer Wert!", index+1, eingabe[index]);
else
zahl=atof(eingabe);

so das wars... hoff das hat dir geholfen... wennst noch fragen hast, steh ich gern noch weiter zur verfügung...


PredeX


Alle Zeitangaben in WEZ +2. Es ist jetzt 05:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag