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.

