Avatar billede naxosnaxos Nybegynder
30. april 2003 - 15:57 Der er 8 kommentarer og
1 løsning

C problemer Linux. Indtastning fra keyboard

Hej

Jeg er ved at lave et C program under Linux. Her skal jeg kunne lave nogle menu valg, ved at bruge taster et tal eller bogstav. det fungerer så vidt også fint. men det er som om at efter første gang jeg har læst ind bliver der noget i den buffer der indlæses i.

jeg har prøvet med følgende:

int choice = getchar();
char read_line[2];
char* temp = gets( read_line );

men synes jeg oplever problemet med begge.

Hvordan gør jeg bedst når jeg skal læse ind??
Det jeg vil have ind er f.eks. 1 eller 2 eller 3 eller q.
andre steder vil jeg gerne have værdier som 23 45 skal kunne indlæses...OG det er som sagt til Linux
Avatar billede arne_v Ekspert
30. april 2003 - 16:06 #1
int choice = getchar();
if(choice=='1') {
} else if(choice=='2') {
} else if(choice=='q') {
}

er OK til at læse et tegn ind.

char read_line[2];
char* temp = gets( read_line );
int v = atoi(temp);

er OK til at læse linier med 23 eller 34.
Avatar billede naxosnaxos Nybegynder
30. april 2003 - 16:11 #2
Er der ikke noget med at man somehow skal flush "input" bufferen efter at have læst ind?? tror der stadig står noget...
Avatar billede arne_v Ekspert
30. april 2003 - 16:13 #3
Det burde ikke være nødvendigt.

Men jeg har da iøvrigt lige opdaget en lille fejl !

Det skal være:

char read_line[4]; /* <---- */
char* temp = gets( read_line );
int v = atoi(temp);

for at der er plads til 23 og 34 (2 tegn + linie-skift + nul byte).
Avatar billede naxosnaxos Nybegynder
30. april 2003 - 16:19 #4
hvad nu hvis jeg bruger scanf() er det en fordel??
Avatar billede arne_v Ekspert
30. april 2003 - 16:24 #5
Hvis det er tal du skal læse: JA.

int v;
scanf("%d",&v);

er meget simplere.
Avatar billede arne_v Ekspert
30. april 2003 - 16:26 #6
Som hovedregel bruger jeg fgets til hele linier som streng og scanf/fscanf
til tal eller blandet tal og tekst.

Hvis du laver programmer der skal være sikre bør du bruge:

char read_line[4];
char* temp = fgets( stdin, read_line, sizeof(read_line) );

i.s.f.:

char read_line[4];
char* temp = gets( read_line );

for at undgå buffer-overflow.
Avatar billede naxosnaxos Nybegynder
30. april 2003 - 16:40 #7
forskellen på de 2 sidst nævnte??
Avatar billede arne_v Ekspert
30. april 2003 - 16:47 #8
Hvis dem der designede stdio for 30 år siden havde tænkt sig om så have der
været:
  fgets - til at læse fra fil - med 3 argumenter buffer+bufferstørrelse+filpointer
  gets - til at læse fra input - med 2 argumenter buffer+filpointer

Det er der imidlertid ikke. Der er:
  fgets - til at læse fra fil - med 3 argumenter buffer+bufferstørrelse+filpointer
  gets - til at læse fra input - med 1 argument buffer

Derfor kan gets bruges til bufferoverflow.

Og derfor er der mange som vælger i.s.f. den ikke
eksisterende:

char read_line[4];
char* temp = gets( read_line, sizeof(read_line) );

at bruge:

char read_line[4];
char* temp = fgets( read_line, sizeof(read_line), stdin );

for at få samme effekt.

[bemærk lige at jeg havde forkert argument rækkefølge til fgets
i 16:26:20 kommentaren]
Avatar billede arne_v Ekspert
30. april 2003 - 16:48 #9
stdin er en fil-pointer til keyboard som bare er der.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

Seneste spørgsmål Seneste aktivitet
I dag 12:22 Excel Makroer programmering bit32 - bit64 Af bhh i Excel
I går 21:13 Samsung tv Af life53@live.dk i Andre styresystemer
I går 21:03 Mount kommando Af Uvanga i Windows
I går 20:40 Eliminer kendte Af andershl i Excel
I går 18:22 Repeater. Af Bit i Mobilnetværk