Innlesning av tekst med fgets() og gets() i C-programmering
Introduksjon
I C-programmering spiller funksjonene fgets()
og gets()
en sentral rolle for å hente brukerinput. Begge brukes for å lese en enkelt tekstlinje fra standard inndata (som regel tastaturet), men det er betydelige forskjeller mellom dem som det er viktig å forstå.
fgets()
fgets()
er en mer sikker og pålitelig funksjon enn gets()
. Den krever tre argumenter:
- En peker til en minneplass (array) der den innleste teksten skal lagres.
- Maksimalt antall tegn som skal leses.
- En peker til inndatastrømmen (vanligvis
stdin
for standard inndata).
fgets()
leser tegn fra inndatastrømmen helt til den møter en linjeskifttegn («\n»), når den angitte størrelsesgrensen er nådd, eller når filslutten er nådd. Den lagrer den innleste teksten i den angitte minneplassen, legger automatisk til en avsluttende nulltegn («\0»), og returnerer en peker til begynnelsen av minneplassen.
Eksempel:
char tekstlinje[100];
fgets(tekstlinje, 100, stdin);
printf("Innlest tekst: %s", tekstlinje);
gets()
gets()
er en eldre og mindre sikker funksjon enn fgets()
. Den tar kun ett argument:
- En peker til en minneplass (array) der den innleste teksten skal lagres.
gets()
leser tegn fra standard inndata helt til den møter en linjeskifttegn («\n»). Den lagrer den innleste teksten i den angitte minneplassen, legger til en avsluttende nulltegn («\0»), og returnerer en peker til begynnelsen av minneplassen.
Eksempel:
char tekstlinje[100];
gets(tekstlinje);
printf("Innlest tekst: %s", tekstlinje);
Sammenligning av fgets() og gets()
Funksjon | Sikkerhet | Pålitelighet | Størrelsesbegrensning | Avsluttende nulltegn |
fgets() |
Sikker | Høy | Ja | Ja |
gets() |
Mindre sikker | Lav | Nei | Ja |
Sikkerhet: fgets()
er sikrere enn gets()
fordi den har en størrelsesbegrensning som argument. Dette hindrer bufferoverflyt, som kan skje hvis brukeren legger inn mer tekst enn minneplassen har plass til. gets()
har ikke en slik begrensning og er derfor mer utsatt for sikkerhetsproblemer.
Pålitelighet: fgets()
er mer pålitelig enn gets()
fordi den fortsetter å lese helt til den møter en linjeskifttegn, selv om det er tomrom eller mellomrom i teksten. gets()
stopper å lese ved første mellomrom eller tomrom.
Størrelsesbegrensning: fgets()
har en størrelsesbegrensning som argument, noe som forhindrer bufferoverflyt. gets()
har ikke en slik begrensning og kan derfor føre til overflyt av bufferen hvis brukeren legger inn for mye data.
Avsluttende nulltegn: Både fgets()
og gets()
legger automatisk til et avsluttende nulltegn («\0») til den innleste teksten. Dette nulltegnet signaliserer slutten av tekstrengene.
Når bør du bruke fgets() eller gets()?
Bruk fgets()
hvis:
- Sikkerhet er viktig.
- Du trenger å lese en tekstlinje med en bestemt maksimal lengde.
- Du trenger å håndtere tomrom og mellomrom i teksten.
Bruk gets()
hvis:
- Sikkerhet ikke er en bekymring.
- Du ikke trenger å begrense lengden på teksten.
- Du kun er interessert i den første delen av teksten.
Konklusjon
fgets()
og gets()
er begge funksjoner som brukes for å hente brukerinput i C-programmering. fgets()
er den foretrukne funksjonen fordi den er sikrere og mer pålitelig enn gets()
. Den gir også mulighet for å angi en størrelsesbegrensning, som forhindrer bufferoverflyt. Hvis sikkerhet er viktig, eller hvis du trenger å håndtere tekstlinjer av en bestemt lengde, bør du bruke fgets()
. Hvis sikkerhet ikke er en bekymring og du bare trenger å lese den første delen av teksten, kan du bruke gets()
.
Ofte stilte spørsmål
1. Hva er forskjellen mellom fgets()
og gets()
?
fgets()
er sikrere og mer pålitelig enn gets()
, og den gir mulighet for å angi en størrelsesbegrensning.
2. Når bør jeg bruke fgets()
?
Bruk fgets()
når sikkerhet er viktig, når du trenger å lese en tekstlinje med en bestemt maksimal lengde, eller når du trenger å håndtere tomrom og mellomrom i teksten.
3. Når bør jeg bruke gets()
?
Bruk gets()
når sikkerhet ikke er en bekymring, når du ikke trenger å begrense lengden på teksten, eller når du kun er interessert i den første delen av teksten.
4. Hva er en bufferoverflyt?
En bufferoverflyt er en sikkerhetsrisiko som oppstår når et program skriver mer data til en buffer enn den er tiltenkt å håndtere.
5. Hvordan kan jeg unngå bufferoverflyt?
Du kan forhindre bufferoverflyt ved å bruke fgets()
med en størrelsesbegrensning.
6. Hva er et avsluttende nulltegn?
Et avsluttende nulltegn er et spesielt tegn («\0») som angir slutten av en tekststreng.
7. Hvorfor er det viktig å bruke et avsluttende nulltegn?
Et avsluttende nulltegn er viktig for å sikre at tekstrenger håndteres korrekt av C-programmeringsspråket.
8. Hva er fordelene ved å bruke fgets()
?
Fordelene ved å bruke fgets()
inkluderer økt sikkerhet, pålitelighet og mulighet for å angi en størrelsesbegrensning.
9. Hva er ulempene ved å bruke gets()
?
Ulempene ved å bruke gets()
inkluderer mindre sikkerhet, lavere pålitelighet og manglende mulighet for å angi en størrelsesbegrensning.
10. Hvilken funksjon bør jeg bruke for å hente brukerinput i C-programmering?
I de fleste tilfeller bør du bruke fgets()
fordi den er sikrere og mer pålitelig enn gets()
.