WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 31.05.2002, 15:17   #1
S@ndy
Jr. Member
 
Registriert seit: 09.05.2002
Alter: 44
Beiträge: 46


Standard 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);
}
S@ndy ist offline   Mit Zitat antworten
Alt 31.05.2002, 16:34   #2
wizo
Inventar
 
Registriert seit: 13.12.1999
Alter: 43
Beiträge: 2.929


wizo eine Nachricht über ICQ schicken
Standard

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
____________________________________
//---< wizo >---\\\\
wizo ist offline   Mit Zitat antworten
Alt 31.05.2002, 17:35   #3
Stona
Inventar
 
Registriert seit: 28.09.2001
Beiträge: 2.179


Standard

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);
Stona ist offline   Mit Zitat antworten
Alt 01.06.2002, 00:39   #4
PredeX
Senior Member
 
Registriert seit: 03.09.2001
Alter: 41
Beiträge: 165


Standard

@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...

PredeX
____________________________________
There are 10 types of people, those who understand binary and those who don\'t...

Ask Me No Questions, And I Tell You No Lies!
PredeX ist offline   Mit Zitat antworten
Alt 01.06.2002, 00:41   #5
PredeX
Senior Member
 
Registriert seit: 03.09.2001
Alter: 41
Beiträge: 165


Standard

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
____________________________________
There are 10 types of people, those who understand binary and those who don\'t...

Ask Me No Questions, And I Tell You No Lies!
PredeX ist offline   Mit Zitat antworten
Alt 01.06.2002, 09:12   #6
S@ndy
Jr. Member
 
Registriert seit: 09.05.2002
Alter: 44
Beiträge: 46


Standard 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...
S@ndy ist offline   Mit Zitat antworten
Alt 01.06.2002, 12:46   #7
PredeX
Senior Member
 
Registriert seit: 03.09.2001
Alter: 41
Beiträge: 165


Standard

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

PredeX
____________________________________
There are 10 types of people, those who understand binary and those who don\'t...

Ask Me No Questions, And I Tell You No Lies!
PredeX ist offline   Mit Zitat antworten
Alt 01.06.2002, 13:44   #8
S@ndy
Jr. Member
 
Registriert seit: 09.05.2002
Alter: 44
Beiträge: 46


Standard 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 )
S@ndy ist offline   Mit Zitat antworten
Alt 01.06.2002, 15:49   #9
PredeX
Senior Member
 
Registriert seit: 03.09.2001
Alter: 41
Beiträge: 165


Standard 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
____________________________________
There are 10 types of people, those who understand binary and those who don\'t...

Ask Me No Questions, And I Tell You No Lies!
PredeX ist offline   Mit Zitat antworten
Alt 01.06.2002, 16:00   #10
PredeX
Senior Member
 
Registriert seit: 03.09.2001
Alter: 41
Beiträge: 165


Standard

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
____________________________________
There are 10 types of people, those who understand binary and those who don\'t...

Ask Me No Questions, And I Tell You No Lies!
PredeX ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:51 Uhr.


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