аналогична функции
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 реализует механизм возврата результата от вызываемой функции к вызывающей. За словом