Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[c] Buffer flushen werkt niet, scanf, code::blocks linuxMint

Pagina: 1
Acties:

Verwijderd

Topicstarter
Beste tweakers,

Ik probeer een programma te schrijven dat de input leest, en bij foutieve input een foutmelding afgeeft.

Mijn probleem is echter dat als ik een waarde verwacht (%d) en een letter stuur, dan kom ik in een oneindige loop, Ondanks dat ik de buffer wis.
Zelfs als ik een voorbeeld programma gebruik die als doel heeft om een goed werkende scanf te hebben.

Ik denk zelf dat het aan de compiler of OS ligt.
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>

int main(void) {
    int getal;
    do {
        printf("Geef een geheel getal: ");
        fflush(stdin);
    } while (scanf("%d", &getal) != 1);
    printf("Het getal is %d.\n", getal);
    printf("Druk op de Enter toets om dit window te sluiten.");
    fflush(stdin);
    getchar();
    return 0;
}


Wat ik dus krijg als ik een letter invoer:
Geef een getal: Geef een getal: Geef een getal: Geef een getal: etc.

Ik gebruik code::blocks in LinuxMint met de GNU gcc compiler in C90.

Iemand enig idee wat hier precies gebeurd en wat er aan gedaan kan worden?

Ruben

  • Mijzelf
  • Registratie: September 2004
  • Niet online
Moet scanf niet fscanf( stdin, zijn?

Verwijderd

Topicstarter
fscanf is dacht ik om een string te 'testen' / lezen.
Ik denk dat fscanf(stdin) het zelfde doet als scanf, maarja ik heb bijna geen ervaring :).

Even testen....

[update]
Het doet bijna het zelfde als de scanf.
Ik krijg nu meteen de "voer een getal in" loop te zien, zonder dat ik iets invoer.

[ Voor 28% gewijzigd door Verwijderd op 02-12-2013 20:38 ]


Verwijderd

Topicstarter
"Klinkt waarschijnlijk als eerste gedachte :+"
Ik ga er vanuit dat er op die site geen onzin staat, en dus dat het onder windows / microsoft studio (bleg) wel werkt, vandaar :).

Ik ben jouw link even aan het doorlezen.

[edit]
fflush(stdin);

This will compile but its behavior is undefined by the ANSI C standard. The fflush() function is only meant to be used on streams open for output, not input. This method does seem to work with some C compilers, but is completely unportable! Thus, it should not be used.
Kijk dat lijkt er meer op!

[update]
Perfect, het werkt nu goed! Heel erg bedankt!
Voor de mensen die het graag willen zien:
C:
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
41
42
43
44
45
46
47
48
49
50
51
#include <stdio.h>

int jaar;
int maand;
int dag;
int x;
char st[31];
void main (void)
{
    do{
    printf("Vul een jaartal in: ");
    scanf("%d", &jaar);
    dump_line(stdin);
    } while (jaar < 0);

    do{
    printf("Vul een maand in: ");
    scanf("%d", &maand);
    dump_line(stdin);
    } while (maand < 1 || maand > 12);

    do{
    printf("Vul een dag in: ");
    scanf("%d", &dag);
    dump_line(stdin);
    } while (dag < 1 || dag > 31);

    printf ("[%d][%d][%d]", dag, maand, jaar);
    getchar();
}



/* function dump_line
*  This function reads and dumps any remaining characters on the current input
*  line of a file.
*  Parameter:
*     fp - pointer to a FILE to read characters from
*  Precondition:
*     fp points to a open file
*  Postcondition:
*     the file referenced by fp is positioned at the end of the next line
*     or the end of the file.
*/
void dump_line( FILE * fp )
{
  int ch;

  while( (ch = fgetc(fp)) != EOF && ch != '\n' )
    /* null body */;
}

[ Voor 96% gewijzigd door Verwijderd op 02-12-2013 21:17 ]


  • Amanush
  • Registratie: Mei 2012
  • Laatst online: 18-06 09:30

Amanush

Saai persoon.

Mooi dat het werkt!

Kan je de volgende keer de naam van de compiler die je genruikt erbij zetten, trouwens?

Ga tot de luiaard, gij mier! Zie haar wegen en wordt wijs.


Verwijderd

Topicstarter
Dat had ik al neer gezet ;)
Ik gebruik code::blocks in LinuxMint met de GNU gcc compiler in C90.
Pagina: 1