Язык программирования Си (Ритчи, Керниган) - страница 59

аналогична функции strindex и отличается от последней только тем, что возвращает не индекс, а указатель.)

После такого проектирования программы ее "деталировка" оказывается очевидной. Мы имеем представление о программе в целом и знаем, как взаимодействуют ее части. В нашей программе образец для поиска задается строкой-литералом, что снижает ее универсальность. В главе 5 мы еще вернемся к проблеме инициализации символьных массивов и покажем, как образец сделать параметром, устанавливаемым при запуске программы. Здесь приведена несколько измененная версия функции getline, и было бы поучительно сравнить ее с версией, рассмотренной в главе 1.

>#include ‹stdio.h›

>#define MAXLINE 1000 /* максимальный размер вводимой строки */


>int getline(char line[], int max);

>int strindex(char source[], char searchfor[]);


>char pattern[] ="ould"; /* образец для поиска */


>/* найти все строки, содержащие образец */


>main()

>{

> char line[MAXLINE];

> int found = 0;

> while (getline(line, MAXLINE) › 0)

>  if (strindex(line, pattern) ›= 0) {

>   printf ("%s", line);

>   found++;

>  }

> return found;

>}


>/* getline: читает строку в s, возвращает длину */

>int getline(char s[], int lim)

>{

> int c, i;

> i = 0;

> while (--lim › 0 && (c=getchar()) != EOF && с != '\n') /* I.B.: misprint was here -lim instead of --lim */

>  s[i++] = c;

> if (c == '\n')

>  s[i++] = c;

> s[i] = '\0';

> return i;

>}


>/* strindex: вычисляет место t в s или выдает -1, если t нет в s */

>int strindex (char s[], char t[])

>{

> int i, j, k;

> for (i = 0; s[i] != '\0'; i++) {

>  for (j = i, k = 0; t[k] !=  '\0' && s[j] == t[k]; j++, k++)

>   ;

>  if (k › 0 && t[k] == '\0')

>   return i;

> }

> return -1;

>>}

Определение любой функции имеет следующий вид:

>тип-результата имя-функции (объявления аргументов)

>{

> объявления и инструкции

>}

Отдельные части определения могут отсутствовать, как, например, в определении "минимальной" функции

>dummy() {}

которая ничего не вычисляет и ничего не возвращает. Такая ничего не делающая функция в процессе разработки программы бывает полезна в качестве "хранителя места". Если тип результата опущен, то предполагается, что функция возвращает значение типа int.

Любая программа - это просто совокупность определений переменных и функций. Связи между функциями осуществляются через аргументы, возвращаемые значения и внешние переменные. В исходном файле функции могут располагаться в любом порядке; исходную программу можно разбивать на любое число файлов, но так, чтобы ни одна из функций не оказалась разрезанной.

Инструкция return реализует механизм возврата результата от вызываемой функции к вызывающей. За словом