1. Sissejuhatus
fgets
funktsioon on C-keeles standardraamatukogu funktsioon, mis võimaldab turvaliselt lugeda stringe. Seda kasutatakse laialdaselt turvalise alternatiivina vanale gets
funktsioonile. Selles artiklis selgitame üksikasjalikult fgets
funktsiooni kasutamist, selle eeliseid ja puudusi ning turvalisi sisendi töötlemise meetodeid.
2. fgets
funktsiooni põhiline kasutus
2.1 fgets
süntaks ja parameetrid
fgets
põhistruktuur on järgmine.
char *fgets(char *str, int n, FILE *stream);
str
: Puhver, kuhu salvestatakse sisestatud stringn
: Maksimaalne loetavate märkide arv (puhvri suurus)stream
: Sisendvoog (tavaliseltstdin
)
2.2 Näidiskoodi tutvustus
Allpool on näide fgets
kasutamisest.
char buffer[50];
fgets(buffer, 50, stdin);
printf("Sisestatud string: %s", buffer);
See kood loeb kasutajalt kuni 49 märki (koos lõputähisega kokku 50) ning väljastab tulemuse.
3. fgets
eelised ja probleemid
3.1 Turvalisus võrreldes gets
funktsiooniga
gets
funktsioon võib põhjustada puhvri ületäitumist, mis on suur turvarisk. fgets
võimaldab määrata loetavate märkide arvu, aidates vältida puhvri ületäitumist.
3.2 Reavahetuse märkide probleem ja puhvri käsitlemine
fgets
loeb sisendiga kaasa ka reavahetuse märgi, mis võib põhjustada soovimatuid tulemusi. Samuti, kui sisestus ületab puhvri suuruse, jääb üleliigne andmestik sisendvoogu alles.
4. Turvalised sisendi töötlemise viisid
4.1 Kuidas eemaldada reavahetuse märk
fgets
abil loetud string võib sisaldada reavahetuse märki. Selle eemaldamiseks lisa järgmine kood:
char *newline = strchr(buffer, '\n');
if (newline) {
*newline = '\0';
}
See asendab reavahetuse märgi lõputähisega ja muudab stringi korrektseks.
4.2 Puhvri tühjendamise viis
Kui sisend ületab puhvri suuruse, võib sisendvoogu jääda üleliigseid andmeid. Selle vältimiseks lisa puhastusprotsess:
while ((getchar()) != '\n' && !feof(stdin));
See kood puhastab sisendvoo kuni reavahetuse märgi või faili lõpuni.
5. fgets
kasutamisel tähelepanu vajavad punktid
5.1 Vigade ja erandite käsitlemise tähtsus
fgets
tagastab osuti eduka sisendi korral, aga NULL
, kui sisend ebaõnnestub. Vigade käsitlemine on oluline.
if (fgets(buffer, sizeof(buffer), stdin) == NULL) {
// Vigade käsitlemine
}
5.2 Parimad praktikad
fgets
kasutamisel mõtle alati puhvri suurusele ja vigade käsitlemisele. Kontrolli sisendandmeid ja väldi puhvri ületäitumist, et kirjutada turvalist koodi.
6. fgets
praktilised koodinäited
6.1 Sisendi valideerimine ja puhastamine
Kasutaja sisendi töötlemisel on oluline kontrollida ja puhastada sisestust. Allolev näide kontrollib, et sisestus koosneb ainult numbritest.
char input[10];
if (fgets(input, sizeof(input), stdin) != NULL) {
// Eemalda reavahetuse märk
char *newline = strchr(input, '\n');
if (newline) {
*newline = '\0';
}
// Kontrolli, et sisestus oleks ainult numbrid
if (strspn(input, "0123456789") == strlen(input)) {
printf("Sisestatud number: %s\n", input);
} else {
printf("Vigane sisestus. Palun sisesta ainult numbrid.\n");
}
}
7. Kokkuvõte
fgets
funktsioon on mugav ja turvaline vahend stringide lugemiseks C-keeles. Võrreldes gets
funktsiooniga on see ohutum ja aitab vähendada puhvri ületäitumise riski. Siiski nõuab fgets
kasutamine reavahetuse märkide ja puhvri puhastamise osas täiendavat tähelepanu. Kasuta selles artiklis toodud tehnikaid turvaliseks ja tõhusaks sisendi töötlemiseks.