[c++] Hoe beveilig ik de invoer in mijn programma

Pagina: 1
Acties:
  • 285 views sinds 30-01-2008
  • Reageer

  • Master_Egg
  • Registratie: November 2000
  • Laatst online: 11-09 16:44

Master_Egg

Schapie schapie schapie!

Topicstarter
Vraagje:

Ik ben een programma aan het schrijven wat af en toe vraaagt om een invoer. Deze wordt dan gescant en daarna gebruikt in een switch met verschillende cases.
printf ("\n*** MENU xxx ***\n\n\n"
"[1] xxx\n"
"[2] xxx\n"
"[3] xxx\n"
"[4] xxx\n\n"
"Uw keuze is: ");
scanf ("%d", &keuze);
while(keuze<1 || keuze>4)
{
clrscr ();
printf("\n### Uw invoer is niet herkent, probeert u het nog een keer ###\n\n"
"*** MENU xxx ***\n\n"
"[1] xxx\n"
"[2] xxx\n"
"[3] xxx\n"
"[4] xxx\n\n"
"Uw keuze is: ");
scanf("%d", &keuze);
}
//hierna komt er dan een switch met case
hoe kan ik er voor zorgen dat de invoer alleen cijfers acepteerd en dat als er "perongeluk" op een lettertoets (dus char) wordt gedrukt niet direct het programma hangt?

En een andere vraag:

Hoe kan er voor zorgen dat als de invoer 6 letters moet zijn of bijv. max 25 char's mag zijn dat er niet meer dan zoveel mogen worden ingevoerd door de gebruiker en dus ook zichtbaar zijn op het scherm.

thx Master_Egg

  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Ik ben achter dit klie-kla-klote probleem gekomen en ook nog een n00b. Gewoon streams gebruiken met cin en cout (c++ werk dus). En dan met scanf(%d, &var) getal uitlezen.

(ongeveer toch?)

Steun Elkaar, Kopieer Nederlands Waar!


  • Master_Egg
  • Registratie: November 2000
  • Laatst online: 11-09 16:44

Master_Egg

Schapie schapie schapie!

Topicstarter
kan je simpel vb/ omschrijving geven.

ben nog niet zo heel erg handig in C :)
wat bedoel je met streams? dit zegt me niks.

thx Master_Egg

  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
je kan met isdigit() kijken of een character een nummer is of niet... returned gewoon een boolean.

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


  • Master_Egg
  • Registratie: November 2000
  • Laatst online: 11-09 16:44

Master_Egg

Schapie schapie schapie!

Topicstarter
Op zondag 16 december 2001 18:26 schreef _Mo_ het volgende:
je kan met isdigit() kijken of een character een nummer is of niet... returned gewoon een boolean.
ja maar dan is het al te laat. Hij hangt op het moment dat ie 'm scant. ifdigit() is dan niet meer zinvol.

  • Quorton
  • Registratie: Januari 2001
  • Laatst online: 29-08 14:03
while (FALSE)
{
char a = getch();
if (a >= '1' && a <= '4')
{
break;
}
}

Quadcore 6600 @ 3,3Ghz, 4 GB, 2 TB raid 5, GF 8400GS
P4 2.8G, 2 GB, 500GB diskspace, GF FX5200


  • Primal
  • Registratie: Augustus 2001
  • Laatst online: 11-09 14:32
Als je wilt dat je voor een bepaalde invoer niet meer als bijv. 6 characters mag inlezen, dan zul je de invoer per character moeten gaan inlezen. Op dit moment lees je in 1 keer 1 hele regel in. Dat moet je dan dus per character gaan doen met bijv.: GetChar() of zoiets. Ik heb effe in een paar minuten tijd een pseudo code in elkaar gerammeld. Het gaat om het idee, ik heb je een opzetje gegeven. Jij moet de rest doen, hier en daar wat bijschaven.
code:
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
37
38
39
40
   BOOL GetLineInput(char *pString, int iNrOfChars, BOOL bDigitsAllowed)
   {
    int iLength = 0;  // Houdt bij hoeveel chars zijn ingevoerd.
    BOOL bEscape = FALSE, // Geeft aan of op Escape is gedrukt om te stoppen met invoer.
         bEnter = FALS; // Klaar met invoeren. Gebruiker drukt dus op Enter.
    char cTempChar;

    while ((bEscape == FALSE) && (bEnter == FALSE))
    {
        cTempChar = GetChar();
        if (iLength < iNrOfChars)
        {
          if ((cTempChar >= 48) && (cTempChar <= 57)
            && (bDigitsAllowed == FALSE))
          {
            // Beep, je mag geen cijfers invoeren.
          }
          else if (cTempChar == 8) // Geloof ik backspace.
          {
            if (iLength > 0)
            {
                iLength--;
            }
          }
            else if (cTempChar == 13) // Enter of zo
            {
                bEnter = TRUE;
            }
          else
          {
            pString[iLength] = cTempChar;
            iLength++;
          }
        }
        else
        {
          // Beep, niet meer characters. :)
        }
    }
   }

"The fastest code, is the code that is never called."


  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op zondag 16 december 2001 18:37 schreef Quorton het volgende:
code:
1
2
3
4
5
6
7
8
while (FALSE)
{
  char a = getch();
  if (a >= '1' && a <= '4')
  {
    break;
  }
}
maak daar maar while (1) van :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Master_Egg
  • Registratie: November 2000
  • Laatst online: 11-09 16:44

Master_Egg

Schapie schapie schapie!

Topicstarter
Op zondag 16 december 2001 18:37 schreef Quorton het volgende:
while (FALSE)
{
char a = getch();
if (a >= '1' && a <= '4')
{
break;
}
}
dat is slim ja. Ik had ook zoiets geprobeert met een string (van 1 karakter, 2 als je \0 meetelt), maar als je dan invoert: 21 dan hangt ie alsnog omdat het dan teveel karakters zijn. En als je er dan een array van maakt kan je switch() het weer niet aan, omdat ie maar 1 karakter aankan :( .

  • cobratbq
  • Registratie: Maart 2001
  • Laatst online: 17-12-2015
Op zondag 16 december 2001 18:45 schreef Master_Egg het volgende:

[..]

dat is slim ja. Ik had ook zoiets geprobeert met een string (van 1 karakter, 2 als je \0 meetelt), maar als je dan invoert: 21 dan hangt ie alsnog omdat het dan teveel karakters zijn. En als je er dan een array van maakt kan je switch() het weer niet aan, omdat ie maar 1 karakter aankan :( .
Da's tamelijk makkelijk, daar heb je verschillende oplossingen voor.
1. Gebruik atoi (maar da's weer lastig omdat je die geloof ik niet voor array's kunt gebruiken)
2. Gebruik
if( ... )
{
}
else if( ... )
{
}

Het is misschien iets langer werk dan switch, case.
Maar als je meer programmeert zul je merken dat je toch meer de if-statement gebruikt.
Tenminste, ik programmeer nog niet zo heel lang, een jaartje, misschien 2, maar ik gebruik eigenlijk bijna nooit de case-statement.

Als je per se 6 karakters wilt hebben kun je dit trouwens op deze manier doen:

char karakter[7];

for( i = 0; i < 6; i++ )
karakter[i] = getche();


Wil je er per se integer waardes hebben dan doe je dat zo
(Dit heb ik zelf nooit geprobeerd, maar het zou moeten werken):

int integers[7];

for( i = 0; i < 6; i++ )
integers[i] = atoi( getch() );

Successss.....

:7

One ring to rule them all, one ring to find them, one ring to bring them all, and in darkness bind them...


  • Master_Egg
  • Registratie: November 2000
  • Laatst online: 11-09 16:44

Master_Egg

Schapie schapie schapie!

Topicstarter
k thx all,

i gonna try

Master_Egg

  • cobratbq
  • Registratie: Maart 2001
  • Laatst online: 17-12-2015
Op zondag 16 december 2001 20:16 schreef Master_Egg het volgende:
k thx all,

i gonna try

Master_Egg
Welke compiler gebruik je eigenlijk?
Of in ieder geval... waar programmeer je in?
Een hele oude maar toch nog steeds een goede compiler is Turbo C 2.01. Hij is gratis te downloaden van de Borland Community (www.borland.com). Je mot alleen ff een wachtwoord aanvragen weet je wel, die standaard.
Hij staat daar als "antique software". Gratis te downloaden en het is een prima compiler, met een hele zooi aan informatie en voorbeelden in een klein progje genaamd THelp.exe (of .com).

One ring to rule them all, one ring to find them, one ring to bring them all, and in darkness bind them...


  • Master_Egg
  • Registratie: November 2000
  • Laatst online: 11-09 16:44

Master_Egg

Schapie schapie schapie!

Topicstarter
Op zondag 16 december 2001 20:21 schreef cobratbq het volgende:

[..]

Welke compiler gebruik je eigenlijk?
Of in ieder geval... waar programmeer je in?
Een hele oude maar toch nog steeds een goede compiler is Turbo C 2.01. Hij is gratis te downloaden van de Borland Community (www.borland.com). Je mot alleen ff een wachtwoord aanvragen weet je wel, die standaard.
Hij staat daar als "antique software". Gratis te downloaden en het is een prima compiler, met een hele zooi aan informatie en voorbeelden in een klein progje genaamd THelp.exe (of .com).
Om me windows bak borland C++ 5.02, en dadelijk in linux (debian) gcc

maarehh, is die turbo c compiler beter? voor dos omgeving dan die nieuwe die ik nu gebruik?

  • Quorton
  • Registratie: Januari 2001
  • Laatst online: 29-08 14:03
Op zondag 16 december 2001 18:45 schreef Master_Egg het volgende:

[..]

dat is slim ja. Ik had ook zoiets geprobeert met een string (van 1 karakter, 2 als je \0 meetelt), maar als je dan invoert: 21 dan hangt ie alsnog omdat het dan teveel karakters zijn. En als je er dan een array van maakt kan je switch() het weer niet aan, omdat ie maar 1 karakter aankan :( .
je vroeg alleen om invoer van 1 tot 4. Maar goed....
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
char txt[81];
BOOL bContinue = TRUE;
while (bContinue) //   OiSyN was wel wakker
{
  printf( "Input a string: " );
  gets(txt);
  int keuze = atoi(txt);
  switch(keuze)
  {
     case 1:
     ..
     bContinue = FALSE; 
     break;
     case 11:
     ..
     bContinue = FALSE;
     break;
etc....
  }
}

Quadcore 6600 @ 3,3Ghz, 4 GB, 2 TB raid 5, GF 8400GS
P4 2.8G, 2 GB, 500GB diskspace, GF FX5200


  • Master_Egg
  • Registratie: November 2000
  • Laatst online: 11-09 16:44

Master_Egg

Schapie schapie schapie!

Topicstarter
Op zondag 16 december 2001 23:32 schreef Quorton het volgende:

[..]

je vroeg alleen om invoer van 1 tot 4. Maar goed....
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
char txt[81];
BOOL bContinue = TRUE;
while (bContinue) //   OiSyN was wel wakker
{
  printf( "Input a string: " );
  gets(txt);
  int keuze = atoi(txt);
  switch(keuze)
  {
     case 1:
     ..
     bContinue = FALSE; 
     break;
     case 11:
     ..
     bContinue = FALSE;
     break;
etc....
  }
}
thx man :)

klopt hij moet ook alleen 1 t/m 4 toe laten. Maar dit ging om het vb. dat als je perongeluk 12 of 21 of in iedergeval meer dan 1 cijfer invoerd dat ie nog steeds hangt.

  • Jerry
  • Registratie: September 2001
  • Laatst online: 24-03 16:08

Jerry

Who?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
do
{
    item = getch();
}
while((item < 49) || (item > 51));
    
switch(item)
{   
    case 49:    //nummer 1
        menu_item1();   
        break;
    case 50:    //nummer 2
        menu_item2();
        break;
    case 51:    //nummer 3
        menu_item3();
        break;
      case 52:  //nummer 4
            menu_item4();
            break;
}

Zo kan je het ook doen. Je kijkt hier gewoon naar de ASCII-waarde van de toetsen die je indrukt en dan heb je geen probleem dat hij blijft hangen.

suc6

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Mr_UnAnimouS:
code:
1
meuk

Zo kan je het ook doen. Je kijkt hier gewoon naar de ASCII-waarde van de toetsen die je indrukt en dan heb je geen probleem dat hij blijft hangen.

suc6
Waarom niet gewoon:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
char ch;
int  ok = 0;

while ( ok == 0 )
{
   ch = getch ();
   switch ( ch )
   {
    case '1':
       ...
    case '2':
       ...
    case 27: // Escape
       ok = 1;
    default:
       break;
   }
}

Voordeel is dat je dan na uitvoer van de code binnen de cases weer terugkomt "in het hoofdmenu"

ach... what's the difference.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Master_Egg
  • Registratie: November 2000
  • Laatst online: 11-09 16:44

Master_Egg

Schapie schapie schapie!

Topicstarter
Op maandag 17 december 2001 10:09 schreef drm het volgende:

[..]

Waarom niet gewoon:
code:
1
meuk

Voordeel is dat je dan na uitvoer van de code binnen de cases weer terugkomt "in het hoofdmenu"

ach... what's the difference.
met die do while lus is inderdaad niet zo handig. Ik heb het nooit zo op "do while" lussen maar voor de rest is dit idd een handige code om te gaan kijken naar je invoer. btw ik werk nu in mijn prog met atoi()

thx all

  • Jerry
  • Registratie: September 2001
  • Laatst online: 24-03 16:08

Jerry

Who?

Op maandag 17 december 2001 10:09 schreef drm het volgende:
code:
1
sourcemeuk

Voordeel is dat je dan na uitvoer van de code binnen de cases weer terugkomt "in het hoofdmenu"

ach... what's the difference.
Ja ik weet het. Het is niet het mooiste stuk code, maar dit had ik nog ergens liggen. Als ik het nu over zou doen dan zou ik het doen zoals jij zegt :).

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Op zondag 16 december 2001 18:37 schreef Quorton het volgende:
while (FALSE)
{
char a = getch();
if (a >= '1' && a <= '4')
{
break;
}
}
Je kunt natuurlijk ook een echte loop gebruiken:

char input;
do {
input=getch();
} while ( input <='1' || input >='4' );

Dat leest wat makkelijker
"Lees input zolang het niet tussen de 1 en 4 ligt"

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Op maandag 17 december 2001 11:29 schreef MSalters het volgende:

[..]

Je kunt natuurlijk ook een echte loop gebruiken:

char input;
do {
input=getch();
} while ( input <='1' || input >='4' );

Dat leest wat makkelijker
"Lees input zolang het niet tussen de 1 en 4 ligt"
Maar als je nou 1 optie toe wilt voegen moet je 2 aanpassingen doen in je code ;)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Op zondag 16 december 2001 23:36 schreef Master_Egg het volgende:

[gets]
gets = :( = bufferoverflow
fgets( stdin ... ) = :) = veilig omdat je een buffersize meegeeft.

IHA wordt gets() als een bug in de C library gezien.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Op maandag 17 december 2001 12:01 schreef drm het volgende:

[..]

Maar als je nou 1 optie toe wilt voegen moet je 2 aanpassingen doen in je code ;)
Ik mag geen mensen meer flamen, maar als we het over maintainability gaan hebben [CENSUUR]:r[CENSUUR]

Dus wat je wel moet doen is (1) een baseclass menu_optie maken, en (2) een class menu met bv. member .insert(menuoptie&), en member .showmenu() die dan alle menu_opties laat zien, en zelf er nummers 1..N voor zet. Als nummer I gekozen wordt, dan moet class menu menu_optie[ I ].execute() aanroepen. En execute() is dan een virtual functie die voor alle menu_opties anders geimplementeerd is.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1