Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования Π‘ΠΈ. ИзданиС 3-Π΅, исправлСнноС». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 45

Автор Π‘Ρ€Π°ΠΉΠ°Π½ ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½

7.6 Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ошибками (stderr ΠΈ exit)

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ошибок Π² cat нСльзя ΠΏΡ€ΠΈΠ·Π½Π°Ρ‚ΡŒ идСальной. Π‘Π΅Π΄Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ссли Ρ„Π°ΠΉΠ» ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ нСдоступСн, сообщСниС ΠΎΠ± этом ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΏΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π²Ρ‹Π²ΠΎΠ΄Π°. Π­Ρ‚ΠΎ нас устроило Π±Ρ‹, Ссли Π±Ρ‹ Π²Ρ‹Π²ΠΎΠ΄ отправлялся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° экран, a Π½Π΅ Π² Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ ΠΏΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Π§Ρ‚ΠΎΠ±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ с этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΠΎΠΌΠΈΠΌΠΎ стандартного Π²Ρ‹Π²ΠΎΠ΄Π° stdout придаСтся Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ stderr. Π’Ρ‹Π²ΠΎΠ΄ Π² stderr ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ отправляСтся Π½Π° экран, Π΄Π°ΠΆΠ΅ Ссли Π²Ρ‹Π²ΠΎΠ΄ stdout ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅ мСсто. ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡˆΠ΅ΠΌ cat Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΠ»ΠΈΡΡŒ Π² stderr.

#include β€Ήstdio.hβ€Ί

/* cat: конкатСнация Ρ„Π°ΠΉΠ»ΠΎΠ², вСрсия 2 */

main(int argc, char *argv[])

{

 FILE *fp;

 void filecopy(FILE *, FILE *);

 char *prog = argv[0]; /* имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ */

 if (argc == 1) /* Π½Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², копируСтся станд. Π²Π²ΠΎΠ΄ */

  filecopy(stdin, stdout);

 else

  while (--argc β€Ί 0)

   if ((fp = fopen(*++argv, "r")) == NULL) {

    fprintf(stderr, "%s: Π½Π΅ ΠΌΠΎΠ³Ρƒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» %s\n", prog, *argv);

    exit(1);

   } else {

    filecopy(fp, stdout);

    fclose(fp);

   }

 if (ferror(stdout)) {

  fprintf(stderr, "%s: ошибка записи Π² stdout\n", prog);

  exit(2);

 }

 exit(0);

}

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° сигнализируСт ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… двумя способами. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ - сообщСниС ΠΎΠ± ошибкС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ fprintf посылаСтся Π² stderr с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΎ ΠΏΠΎΠΏΠ°Π»ΠΎ Π½Π° экран, Π° Π½Π΅ оказалось Π½Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π΅ ΠΈΠ»ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ Π²Ρ‹Π²ΠΎΠ΄Π°. Имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, хранящССся Π² argv[0], ΠΌΡ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈ Π² сообщСниС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² случаях, ΠΊΠΎΠ³Π΄Π° данная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ совмСстно с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ, Π±Ρ‹Π» ясСн источник ошибки.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ способ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π° ΠΎΡˆΠΈΠ±ΠΊΡƒ - ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exit, Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. АргумСнт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exit доступСн Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ процСссу, Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅ΠΌΡƒ Π΄Π°Π½Π½Ρ‹ΠΉ процСсс. А ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ ΠΈΠ»ΠΈ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π΅ΠΊΠΎΠ΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, которая рассматриваСт эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² качСствС ΠΏΠΎΠ΄Ρ‡ΠΈΠ½Π΅Π½Π½ΠΎΠ³ΠΎ процСсса. По ΠΎΠ±Ρ‰Π΅ΠΉ договорСнности Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ нуля сигнализируСт ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΡ€ΠΎΡˆΠ»Π° Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π½Π΅Π½ΡƒΠ»Π΅Π²Ρ‹Π΅ значСния ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ говорят ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΠΎΡ€ΠΎΠΆΠ½ΠΈΡ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€Π°, накопившиС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ для всСх ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π²Ρ‹Π²ΠΎΠ΄Π°, функция exit Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ fclose.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ return exp Π³Π»Π°Π²Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ main эквивалСнтна ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΡŽ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exit(exp). ПослСдний Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ (с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ exit) ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎ прСимущСство, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π΅Π½ для Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΈ, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, слово exit Π»Π΅Π³ΠΊΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ контСкстного поиска, ΠΏΠΎΡ…ΠΎΠΆΠ΅ΠΉ Π½Π° Ρ‚Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ рассматривали Π² Π³Π»Π°Π²Π΅ 5. Ѐункция ferror Π²Ρ‹Π΄Π°Π΅Ρ‚ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ссли Π² Ρ„Π°ΠΉΠ»Π΅ fp Π±Ρ‹Π»Π° ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π° ошибка.

int ferror(FILE *fp)

Π₯отя ΠΏΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ Ρ€Π΅Π΄ΠΊΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ошибки, всС ΠΆΠ΅ ΠΎΠ½ΠΈ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, оказался ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΌ диск); поэтому Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… ΡˆΠΈΡ€ΠΎΠΊΠΎΠ³ΠΎ пользования ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ.

Ѐункция feof(FILE *fp) aΠ½aΠ»oΠ³ΠΈΡ‡Π½a Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ferror; oΠ½a Π²oΠ·Π²paΡ‰aeΡ‚ Π½eΠ½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ссли встрСтился ΠΊΠΎΠ½Π΅Ρ† ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ Ρ„Π°ΠΉΠ»Π°.

int feof(FILE *fp);

Π’ Π½Π°ΡˆΠΈΡ… Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… ΠΌΡ‹ Π½Π΅ Π·Π°Π±ΠΎΡ‚ΠΈΠ»ΠΈΡΡŒ ΠΎ Π²Ρ‹Π΄Π°Ρ‡Π΅ статуса Π²Ρ‹Ρ…ΠΎΠ΄Π°, Ρ‚. Π΅. Π²Ρ‹Π΄Π°Ρ‡Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ числа, Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ состояниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ: Ρ€Π°Π±ΠΎΡ‚Π° Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»Π°ΡΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ ΠΈΠ»ΠΈ ΠΏΡ€Π΅Ρ€Π²Π°Π½Π° ΠΈΠ·-Π·Π° ошибки? Если Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΡ€Π΅Ρ€Π²Π°Π½Π° Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ошибки, Ρ‚ΠΎ ΠΊΠ°ΠΊΠΎΠΉ? Π›ΡŽΠ±Π°Ρ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ статус Π²Ρ‹Ρ…ΠΎΠ΄Π°.

7.7 Π’Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄ строк

Π’ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ имССтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Π²ΠΎΠ΄Π° fgets, аналогичная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ getline, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ пользовались Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Π³Π»Π°Π²Π°Ρ….

char *fgets(char *line, int maxline, FILE *fp)

Ѐункция fgets Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку Π²Π²ΠΎΠ΄Π° (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΈ символ Π½ΠΎΠ²ΠΎΠΉ строки) ΠΈΠ· Ρ„Π°ΠΉΠ»Π° fp Π² массив символов line, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ MAXLINE-1 символов. ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Π½Π½Π°Ρ строка дополняСтся символом '\0'. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ fgets Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ line, Π° ΠΏΠΎ исчСрпании Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ Π² случаС ошибки - NULL. (Наша getline Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π»Π° Π΄Π»ΠΈΠ½Ρƒ строки, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ ΠΏΠΎΡ‚ΠΎΠΌ пользовались, ΠΈ Π½ΡƒΠ»ΡŒ Π² случаС ΠΊΠΎΠ½Ρ†Π° Ρ„Π°ΠΉΠ»Π°.)

Ѐункция Π²Ρ‹Π²ΠΎΠ΄Π° fputs ΠΏΠΈΡˆΠ΅Ρ‚ строку (которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈ Π½Π΅ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ символом Π½ΠΎΠ²ΠΎΠΉ строки) Π² Ρ„Π°ΠΉΠ».

int fputs(char *line, FILE *fp)

Π­Ρ‚Π° функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ EOF, Ссли Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ошибка, ΠΈ Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС.

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ gets ΠΈ puts ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ функциям fgets ΠΈ fputs. ΠžΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΠ½ΠΈ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ стандартными Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ stdin ΠΈ stdout, ΠΈ ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, gets выбрасываСт послСдний символ '\n', a puts Π΅Π³ΠΎ добавляСт.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ особСнного Π² функциях Π²Ρ€ΠΎΠ΄Π΅ fgets ΠΈ fputs Π½Π΅Ρ‚, ΠΌΡ‹ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌ ΠΈΡ… здСсь Π² Ρ‚ΠΎΠΌ Π²ΠΈΠ΄Π΅, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΎΠ½ΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π² стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Π½Π° нашСй систСмС.

/* fgets: ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ n символов ΠΈΠ· iop */

char *fgets(char *s, int n, FILE *iop) {

 register int c;

 register char *cs;


 cs = s;

 while (--n β€Ί 0 && (с = getc(iop)) != EOF)

  if ((*cs++ = c) == '\n')

   break;

 *cs= '\0';

 return (c == EOF && cs == s) ? NULL : s;

}


/* fputs: посылаСт строку s Π² Ρ„Π°ΠΉΠ» iop */

int fputs(char *s, FILE *iop)

{

 int c;


 while (c = *s++)

  putc(c, iop);

 return ferror(iop) ? EOF : 0;

}

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ опрСдСляСт, Ρ‡Ρ‚ΠΎ функция ferror Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π² случаС ошибки Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅; fputs Π² случаС ошибки Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ EOF, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС - Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ fgets Π»Π΅Π³ΠΊΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ getline:

/* getline: Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ строку, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΅Π΅ Π΄Π»ΠΈΠ½Ρƒ */

int getline(char *line, int max)

{

 if (fgets(line, max, stdin) == NULL)

  return 0;

 else

  return strlen(line);

}

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.6. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‰ΡƒΡŽ Π΄Π²Π° Ρ„Π°ΠΉΠ»Π° ΠΈ ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΡŽΡ‰ΡƒΡŽ ΠΏΠ΅Ρ€Π²ΡƒΡŽ строку, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.7. ΠœΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ поиска ΠΏΠΎ ΠΎΠ±Ρ€Π°Π·Ρ†Ρƒ ΠΈΠ· Π³Π»Π°Π²Ρ‹ 5 Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° Π±Ρ€Π°Π»Π° тСкст ΠΈΠ· мноТСства ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², Π° Ссли ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ… Π½Π΅Ρ‚, Ρ‚ΠΎ ΠΈΠ· стандартного Π²Π²ΠΎΠ΄Π°. Π‘ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒΡΡ имя Ρ„Π°ΠΉΠ»Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π°ΠΉΠ΄Π΅Π½Π° подходящая строка?

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.8. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΡŽΡ‰ΡƒΡŽ нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ². ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с Π½ΠΎΠ²ΠΎΠΉ страницы, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΡΡ‚ΡŒΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ свою Π½ΡƒΠΌΠ΅Ρ€Π°Ρ†ΠΈΡŽ страниц.

7.8 Π”Ρ€ΡƒΠ³ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π’ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ прСдставлСн ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ спСктр Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Настоящий ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„ содСрТит ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠΎΠ±Π·ΠΎΡ€ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΈΠ· Π½ΠΈΡ…. Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ эти ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ описаны Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ B.

7.8.1 ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ со строками

ΠœΡ‹ ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strlen, strcpy, strcat ΠΈ strcmp, описаниС ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Π°Π½Ρ‹ Π² β€Ήstring.hβ€Ί. Π”Π°Π»Π΅Π΅, Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° ΠΏΡƒΠ½ΠΊΡ‚Π°, прСдполагаСтся, Ρ‡Ρ‚ΠΎ s ΠΈ t ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΈΠΏ char *, c ΠΈ n - Ρ‚ΠΈΠΏ int.

strcat(s,t) - приписываСт t Π² ΠΊΠΎΠ½Π΅Ρ† s.

strncat(s,t,n) - приписываСт n символов ΠΈΠ· t Π² ΠΊΠΎΠ½Π΅Ρ† s.

strcmp(s,t) - Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число, Π½ΡƒΠ»ΡŒ ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число для s β€Ή t, s - t ΠΈΠ»ΠΈ s β€Ί t, соотвСтствСнно.

strncmp(s,t,n) - Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ strcmp, Π½ΠΎ количСство сравниваСмых символов Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Ρ‚ΡŒ n

strcpy(s,t) - ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ t Π² s.

strncpy(s,t,n) - ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ n символов ΠΈΠ· t Π² s.

strlen(s) - Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄Π»ΠΈΠ½Ρƒ s.

strchr(s,c) - Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠ΅ появлСниС символа c Π² s ΠΈΠ»ΠΈ, Ссли c Π½Π΅Ρ‚ Π² s, NULL.

strrchr(s,c) - Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° послСднСС появлСниС символа c Π² s ΠΈΠ»ΠΈ, Ссли c Π½Π΅Ρ‚ Π² s, NULL.

7.8.2 Анализ класса символов ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ символов

НСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ β€Ήctype.hβ€Ί Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ символов. Π”Π°Π»Π΅Π΅, Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° ΠΏΡƒΠ½ΠΊΡ‚Π°, пСрСмСнная c - это пСрСмСнная Ρ‚ΠΈΠΏΠ° int, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ прСдставлСна Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ unsigned, char ΠΈΠ»ΠΈ EOF. ВсС эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ значСния Ρ‚ΠΈΠΏΠ° int.