Avatar billede bustermaniac Nybegynder
29. december 2002 - 18:46 Der er 12 kommentarer og
2 løsninger

er gets() farlig??

Hejsa.

Jeg er relativ ny indenfor C-programmering, men jeg har da fået rimelig styr på det indtil videre. Jeg sidder i øjeblikket og leger med forskellige eksempler  med GNU/GCC på min Red Hat 8.0 maskine. Alt funker perfekt, men:

Jeg får en compiler warning der siger: "the gets function is dagerous and should not be used".

Hvad for alternativer er der hvis man skal læse tekstrenge med mellemrum i (altså så scanf() ikke kan bruges)??

Hvad med når man læser filer med fgets()?? andre alternativer??

Jeg leder efter noget der er "platformkombatibelt", da jeg benytter både windows/linux til at programmere på.

På forhånd tak,

BusterManiac.
Avatar billede soreno Praktikant
29. december 2002 - 18:48 #1
fra
$ man gets

Never use gets().  Because it is impossible to tell without knowing the
      data in advance how many  characters  gets()  will  read,  and  because
      gets() will continue to store characters past the end of the buffer, it
      is extremely dangerous to use.  It has  been  used  to  break  computer
      security.  Use fgets() instead.
Avatar billede bustermaniac Nybegynder
29. december 2002 - 18:54 #2
hehe....ja, der kan man se......tænkte ikke på at bruge man......findes der andre alternativer? og hvad med et eksempel eller 2 - 30 point for en henvisning til man.....:D
Avatar billede arne_v Ekspert
29. december 2002 - 18:55 #3
fgets har ikke problemet !

char *gets(char *string);

char *fgets(char *str, int maxchar, FILE *file_ptr);

udover fil-pointeren som alle fxxxx har ekstra i forhold til xxxx, så
har fgets også et argument der fortæller hvor mange bytes der maksimalt
må læses (=hvad der er plads til).

Derfor kan fgets ikke bruges til buffer overflow.

Den "manglende" parameter til gets er en sikkerhedsmæssig
katastrofe og en meget stor del af alle sikkerheds-huller
(udenfor Windows verdenen) skyldes brug af gets.
Avatar billede arne_v Ekspert
29. december 2002 - 18:56 #4
Eksempel:

fgets(buf, sizeof(buf), stdin)

i.s.f.:

gets(buf)
Avatar billede bustermaniac Nybegynder
29. december 2002 - 19:16 #5
tak for de hurtige svar begge to.....½ til hver......lige en sidste ting.....når jeg så læser med fgets() med en buffer på 50 char og teksten er større, hvordan læser jeg så videre?

Altså det må være et loop hvor den læser indtil EOF eller EOL eller noget, men hvordan?
Avatar billede arne_v Ekspert
29. december 2002 - 19:19 #6
Normalt vil man lave bufferen af em størrelse så alle
valid linier kan være i den d.v.s. 1 fgets = 1 linie.

Men ellers må du kalde fgets igen - den stopper når enten
den finder et linie skift eller bufferen er fuld.

Bemærk at fgets (ligesom gets) faktisk læser newline ind
i bufferen så du kan teste for om den er der.

EOF må du teste for på anden vis.
Avatar billede bustermaniac Nybegynder
29. december 2002 - 19:24 #7
ahh....den stopper ved linieskift....fint....men hvad returnere den når dem møder sådan et??
Avatar billede arne_v Ekspert
29. december 2002 - 19:26 #8
Hvis du indtaster ABC<RETUR> så vil du have en string med
"ABC\n" altså:
  alle tegnene der er tastet
  \n
  en nul byte som terminarer alle C strenge
Avatar billede arne_v Ekspert
29. december 2002 - 19:27 #9
Jeg kommer iøvrigt lige i tvivl om hvorvidt nul byten tæller med
i maxchar.

Hvis ikke så skal man kalde med:
  fgets(buf, sizeof(buf)-1, stdin)
for at have plads til denne.
Avatar billede bustermaniac Nybegynder
29. december 2002 - 19:28 #10
jeps....har lige leget lidt med det.....

#include <stdio.h>
#include <string.h>

int main()

{
    char arr[50];

    puts("Enter your name, please: ");
    while (fgets(arr, sizeof(arr), stdin))
    {
        printf("Hi %s\n", arr);
    }
    printf("done.");
    return 0;
}

Den går ud af loopet ved EOF, altså CRTL-D, men er der andre måder end det?
Avatar billede arne_v Ekspert
29. december 2002 - 19:32 #11
Du kan jo altid ligge logik ind i din kode der
stopper ved visse former for input.

"exit", "quit" og "stop" f.eks..
Avatar billede bustermaniac Nybegynder
29. december 2002 - 19:36 #12
jo, selvfølgelig....prøver bare at finde ud af om den ikke har "fejl" som scanf(), så man "mister" noget tekst, hvis der bliver sendt et tegn, men det ser det ikke ud til.

Tak for hjælpen igen,

Mark.
Avatar billede arne_v Ekspert
29. december 2002 - 19:53 #13
fgets henter en rå linie uden dikkedarer.

Ofte vil man have:
  if(arr[strlen(arr)-1]=='\n') arr[strlen(arr)-1]='\0';
for at slippe af men den newline i bufferen.

PS: Jeg checkede lige - den tæller nul byten med i maxchar, så ingen problemer.
Avatar billede bustermaniac Nybegynder
29. december 2002 - 20:12 #14
ahh...perfekt....det sad jeg lige og rodede med....
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