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

Что касается функции strcpy из стандартной библиотеки ‹string.h› то она возвращает в качестве своего результата еще и указатель на новую копию строки.

Вторая программа, которую мы здесь рассмотрим, это strcmp(s,t). Она сравнивает символы строк s и t и возвращает отрицательное, нулевое или положительное значение, если строка s соответственно лексикографически меньше, равна или больше, чем строка t. Результат получается вычитанием первых несовпадающих символов из s и t.

>/* strcmp: выдает ‹ 0 при s ‹ t, 0 при s - t, › 0 при s › t */

>int strcmp(char *s, char *t)

>{

> int i;

> for (i = 0; s[i] == t[i]; i++)

>  if (s[i] == '\0')

>   return 0;

> return s[i] - t[i];

>}

Та же программа с использованием указателей выглядит так:

>/* strcmp: выдает ‹ 0 при s ‹ t, 0 при s - t, › 0 при s › t */

>int strcmp(char *s, char *t)

>{

> for (; *s == *t; s++, t++)

>  if (*s == '\0')

>   return 0;

> return *s - *t;

>}

Поскольку операторы ++ и - могут быть или префиксными, или постфиксными, встречаются (хотя и не так часто) другие их сочетания с оператором *. Например.

>*--p;

уменьшит p прежде, чем по этому указателю будет получен символ. Например, следующие два выражения:

>*p++ = val; /* поместить val в стек */

>val = *--p; /* взять из стека значение и поместить в val */

являются стандартными для посылки в стек и взятия из стека (см. параграф 4.3.).

Объявления функций, упомянутых в этом параграфе, а также ряда других стандартных функций, работающих со строками, содержатся в заголовочном файле ‹string.h›.

Упражнение 5.3. Используя указатели, напишите функцию strcat, которую мы рассматривали в главе 2 (функция strcat(s,t) копирует строку t в конец строки s).

Упражнение 5.4. Напишите функцию strend(s,t), которая выдает 1, если строка t расположена в конце строки s, и нуль в противном случае.

Упражнение 5.5. Напишите варианты библиотечных функций strncpy, strncat и strncmp, которые оперируют с первыми символами своих аргументов, число которых не превышает n. Например, strncpy(t,s,n) копирует не более n символов t в s. Полные описания этих функций содержатся в приложении B.

Упражнение 5.6. Отберите подходящие программы из предыдущих глав и упражнений и перепишите их, используя вместо индексирования указатели. Подойдут, в частности, программы getline (главы 1 и 4), atoi, itoa и их варианты (главы 2, 3 и 4), reverse (глава 3), а также strindex и getop (глава 4).

5.6 Массивы указателей, указатели на указатели

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