gets








     fgetc,  fgets,  getc,  getchar, gets, ungetc −
ÑÑнкÑÑÑ Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ñ ÑимволÑв Ñ Ð»Ð°Ð½ÑÑжкÑв




     #Ñnclude <stdio.h>

Ñnt fgetc(FÐLE *stream);

char *fgets(char *s, int size, FÐLE *stream);

Ñnt getc(FÐLE *stream);

int getchar(void);

char *gets(char *s);

Ñnt ungetc(Ñnt c, FÐLE *stream);




     fgetc() зÑиÑÑÑ Ð½Ð°ÑÑÑпний Ñимвол з
поÑÐ¾ÐºÑ stream Ñ Ð¿Ð¾Ð²ÐµÑÑÐ°Ñ Ð¹Ð¾Ð³Ð¾
пеÑеÑвоÑеним  Ñ unsigned  char,  зведенним
до int, або конÑÑанÑÑ EOF по доÑÑгненнÑ
кÑнÑÑ ÑÐ°Ð¹Ð»Ñ Ð°Ð±Ð¾ помилÑÑ.

getc() ÑÑожа на fgetc(), але вона може
бÑÑи  ÑеалÑÐ·Ð¾Ð²Ð°Ð½Ð¾Ñ Ñк  макÑоÑ,  Ñо
оÑÑнÑваÑиме  поÑÑÑÐ¿Ð»ÐµÐ½Ð½Ñ  з поÑÐ¾ÐºÑ stream
бÑлÑÑе одного ÑазÑ.

getchar() Ñ Ñим Ñамим Ñо й getc(stdin).

gets() зÑиÑÑÑ ÑÑдок з stdin Ñ Ð·Ð°Ð¿Ð¸ÑÑÑ  його  Ñ
бÑÑеÑ,  на Ñкий  вказÑÑ Ð¿Ð¾ÐºÐ°Ð¶Ñик s,
поки не зÑÑÑÑÑнеÑÑÑÑ Ñимвол нового
ÑÑдка або EOF, Ñо  замÑнÑÑÑÑÑÑ  на  ’\0’.
ÐÐ¾Ð´Ð½Ð¾Ñ  пеÑевÑÑки  на пеÑеповненнÑ
бÑÑеÑа не вÑдбÑваÑÑÑÑÑ (дивÑÑÑÑÑ ÐÐÐÐ
нижÑе).

fgets() зÑиÑÑÑ ÑонайбÑлÑÑе size ‐ 1 ÑимволÑв
з  stream  Ñ Ð·Ð°Ð½Ð¾ÑиÑÑ ÑÑ Ñ  бÑÑеÑ,  на  Ñкий
вказÑÑ Ð¿Ð¾ÐºÐ°Ð¶Ñик s.   ЧиÑаннÑ
пеÑеÑиваÑÑÑÑÑ ÑкÑо доÑÑгнÑÑо EOF або
ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ ÑÑдка.  ЯкÑо  зÑиÑано
Ñимвол  нового  ÑÑдка,  Ñо вÑн
заноÑиÑÑÑÑ Ð² бÑÑеÑ.  ÐапÑикÑнÑÑ  ÑÑдка
завжди  додаÑÑÑÑÑ   ’\0’   пÑÑлÑ









                             ‐2‐


оÑÑаннÑого зÑиÑаного знакÑ.

ungetc()  заноÑиÑÑ  c  назад Ñ stream, Ñ
пеÑеÑвоÑÑваÑиме Ñ unsigned  char,  ÑкÑо  Ñе
можливо  Ñ  подалÑÑÐ¸Ñ  опеÑаÑÑй
ÑиÑаннÑ.  ÐанеÑÐµÐ½Ñ  назад  Ñимволи
бÑдÑÑÑ  повеÑÑаÑиÑÑ  в звоÑоÑномÑ
поÑÑдкÑ;  гаÑанÑÑÑÑÑÑÑ  ÑÑлÑки  одне
занеÑÐµÐ½Ð½Ñ ÑимволÑв.

Ðиклики  ÑÑнкÑÑй,  опиÑÐ°Ð½Ð¸Ñ  ÑÑÑ,  можÑÑÑ
пеÑемежовÑваÑиÑÑ Ð¾Ð´Ð½Ðµ з одним Ñ  з
викликами  до  ÑнÑÐ¸Ñ  ÑÑнкÑÑй  Ð²Ð²Ð¾Ð´Ñ  з
бÑблÑоÑеки stdio Ð´Ð»Ñ Ñого Ñамого поÑокÑ
вводÑ.

СÑоÑовно       неблокÑÑÑÐ¸Ñ       ÑÑнкÑÑй,
подивÑÑÑÑÑ unlocked_stdio(3).




     fgetc(), getc() Ñ getchar() повеÑÑаÑÑÑ
пÑоÑиÑаний  Ñимвол Ñк  unsigned  char,
пеÑеÑвоÑений  до  int,  або  EOF  пÑи
доÑÑÐ³Ð½ÐµÐ½Ð½Ñ ÐºÑнÑÑ ÑÐ°Ð¹Ð»Ñ Ð°Ð±Ð¾ помилÑÑ.

gets()  Ñ  fgets()  повеÑÑаÑÑÑ  пÑи   вдаломÑ
завеÑÑÐµÐ½Ð½Ñ Ð¾Ð¿ÐµÑаÑÑÑ  Ñ  NULL,  ÑкÑо  ÑÑалаÑÑ
помилка   або доÑÑгнÑÑо кÑнеÑÑ  ÑайлÑ
Ñз,  ÑÐ¾Ð´Ñ  Ñк  ÑеÑÑа  ÑимволÑв
залиÑилиÑÑ Ð½ÐµÐ¿ÑоÑиÑаними.

ungetc()  повеÑÑÐ°Ñ c пÑи вдалÑй опеÑаÑÑÑ
або EOF Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸.




     ANSI − C, POSIX.1




     ÐÑколи не заÑÑоÑовÑйÑе gets(), ÑÐ¾Ð¼Ñ  Ñо
без  попеÑеднÑого знайомÑÑва   з
даними  неможливо  взнаÑи,  ÑкÑ
кÑлÑкÑÑÑÑ ÑимволÑв  оÑÑÐ¸Ð¼Ð°Ñ  gets(),  а
Ñакож   ÑомÑ,   Ñо   gets() пÑодовжÑваÑиме
заноÑиÑи  Ñимволи  в  бÑÑÐµÑ  навÑÑÑ
пÑÑÐ»Ñ Ð´Ð¾ÑÑÐ³Ð½ÐµÐ½Ð½Ñ Ð¹Ð¾Ð³Ð¾ кÑнÑÑ,  Ñо  дÑже
небезпеÑно.  Ð¦Ñ  ÑÑнкÑÑÑ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑÑÑÑÑÑ
Ð´Ð»Ñ    Ð·Ð»Ð¾Ð¼Ñ   ÑиÑÑем.   ÐамÑÑÑÑ   неÑ
ÑкоÑиÑÑайÑеÑÑ fgets().









                             ‐3‐


Hе  Ñекомендовано  ÑеÑгÑваÑи
виклики  ÑÑнкÑÑй   Ð²Ð²Ð¾Ð´Ñ   з
бÑблÑоÑеки  stdio  з  низÑкоÑÑвневими
викликами read() Ð´Ð»Ñ Ð´ÐµÑкÑипÑоÑа ÑайлÑ,
зв’Ñзаного з поÑоком  вводÑ;
ÑезÑлÑÑÐ°Ñ ÑÑого  бÑде  невизнаÑеним  Ñ,
ÑвидÑе  за  вÑе, не Ñим, Ñо оÑÑкÑÑÑÑÑÑ.

ÐаÑÑÑпний кÑÑоÑок ÐºÐ¾Ð´Ñ Ð´ÐµÐ¼Ð¾Ð½ÑÑÑÑÑ
випадок, коли пÑогÑамÑÑÑ Ð¿ÑипÑÑкаÑ,
Ñо  ÑÑдок  занадÑо довгий, ÑкÑо вÑн не
мÑÑÑиÑÑ Ñимвол нового ÑÑдка:

                   char buf[1024], *p;

                   while (fgets(buf, sizeof(buf), fp) != NULL) {
                       if ((p = strchr(buf, ’\n’)) == NULL) {
                           fprintf(stderr, "input line too long.\n");
                           exit(1);
                       }
                       *p = ’\0’;
                       printf("%s\n", buf);
                   }

Ðе дивлÑÑиÑÑ Ð½Ð° Ñе, Ñо помилка бÑде
дÑйÑноÑ,  ÑкÑо  ÑÑдок пеÑевиÑÑваÑиме
1023  знаки,  вона  не  ÑпÑавдиÑÑÑÑ Ñ
Ð´Ð²Ð¾Ñ ÑнÑÐ¸Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÐ°Ñ:

# ЯкÑо оÑÑаннÑй ÑÑдок  Ñ  ÑÐ°Ð¹Ð»Ñ  не
мÑÑÑиÑÑ  Ñимвола нового  ÑÑдка,  Ñо
ÑÑдок,  Ñкий повеÑне fgets() не мÑÑÑиÑиме
Ñакож.  Тож  strchr()  повеÑне  NULL Ñ
пÑогÑама  завеÑÑиÑÑ ÑÐ²Ð¾Ñ Ð´ÑÑ, навÑÑÑ ÑкÑо
ÑÑдок бÑв Ñинним.  # ÐÑÑ Ð¿Ð¾Ð²’ÑÐ·Ð°Ð½Ñ  з
ÑÑдками  ÑÑнкÑÑÑ  Ñ  C,  strchr() вклÑÑно,
пÑавилÑно  пÑипÑÑкаÑÑÑ Ñо кÑнеÑÑ
ланÑÑжка вказÑÑÑÑÑÑ Ñк  знак  NULL  (’\0’).
ЯкÑо  б пеÑÑим повеÑнÑÑим знаком бÑв
’\0’, strchr() би негайно повеÑнÑла
знаÑÐµÐ½Ð½Ñ  Ñ  завеÑÑила   пÑогÑамÑ, без
ÑозглÑÐ´Ñ ÑеÑÑи вводÑ, Ñ ÑÐºÐ¾Ð¼Ñ Ð´Ñйно мÑг
знаÑодиÑиÑÑ Ð·Ð½Ð°Ðº нового ÑÑдка.

Ðожливо ÑÑнкÑÑÑ fgetln(3)  пÑдÑодиÑÑ  кÑаÑе
Ð´Ð»Ñ  випадкÑв небезпеÑного вводÑ.




     read(2),  write(2), fopen(3), fread(3), scanf(3),
puts(3), fseek(3), ferror(3)

−−−− ÐеÑклав ÐÑÑалÑй ЦибÑлÑк









                             ‐4‐


<vi@uatech.atspace.com>