C keele fgets funktsioon: Turvaline ja tõhus stringide sisendi lugemine

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 string
  • n: Maksimaalne loetavate märkide arv (puhvri suurus)
  • stream: Sisendvoog (tavaliselt stdin)

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.