Резюме
В языке С строка — это последовательность значений типа char, завершающаяся нулевым символом, '\0' Строка может также храниться в символьном массиве. Кроме того, строка может быть представлена с помощью строковой константы, в которой символы кроме нулевого заключены в двойные кавычки. Нулевой символ предоставляется компилятором. Таким образом, строка "мир" сохраняется в памяти как последовательность из четырех символов: м, и, р и \0. Длина строки, измеренная посредством strlen(), не учитывает нулевой символ.
Строковые константы, также известные как строковые литералы, могут использоваться для инициализации символьных массивов. Размер массива должен быть, по меньшей мере, на единицу больше длины строки, чтобы можно было включить нулевой символ. Строковые константы также могут применяться для инициализации указателей на тип char.
Для идентификации обрабатываемой строки функции используют указатель на первый символ этой строки. Обычно соответствующим фактическим аргументом является имя массива, переменная типа указателя или строка в двойных кавычках. В каждой си туации передается адрес первого символа. В общем случае передача длины строки не обязательна, т.к. для обнаружения конца строки функция может применять завершающий нулевой символ.
Функция fgets() извлекает строку из ввода, а функции puts() и fputs() отображают строку вывода. Они входят в семейство функций stdio.h, как раньше было с теперь уже устаревшей и постепенно выводимой из употребления функцией gets().
Библиотека С содержит несколько функций обработки етрок. В стандарте ANSI С эти функции объявлены в файле string.li. Библиотека также имеет ряд функций обработки символов, которые объявлены в файле ctype.h.
474 Глава 11
Программе можно предоставить доступ к аргументам командной строки с помощью двух формальных аргументов функции main(). Первый аргумент, по традиции называемый argc, имеет тип int, и ему присваивается количество слов в командной строке. Второй аргумент, традиционно имеющий имя argv, представляет собой указатель на массив указателей на тип char. Каждый указатель на char ссылается на один из элементов командной строки, при этом argv[0] указывает на имя команды, argv[l] — на первый аргумент командной строки, argv [2] — на второй аргумент и т.д.
Функции atoi(), atol() и atof() преобразуют строковые представления чисел в значения типов int, long и double. Функции strtol(), strtoul() и strtod() преобразуют строковые представления чисел в формы типов long, unsigned long и double.
Вопросы для самоконтроля
Ответы на вопросы для самоконтроля приведены в приложении А.
1. Какая ошибка допущена в представленном объявлении символьной строки?
int main(void)
{
char name[] = {'Л', 'у', 'н', 'а'};

}
2. Что выведет следующая программа?
#include int main(void)
{
char note[] = "Увидимся завтра в кафе."; char *ptr;
ptr = note; puts (ptr); puts(++ptr); note[7] = ‘\0’; puts(note); puts(++ptr); return 0;
}
3. Что выведет следующая программа?
#include
#include int main(void)
{
char food[] = "Вкусно"; char *ptr;
ptr = food + strlen(food); while (--ptr >= food) puts (ptr); return 0;
}
4. Что выведет следующая программа?
#include
#include
Символьные строки и строковые функции 475
int main(void)
{
char goldwyn[40] = "ovy я смог ";
char samuel[40] = "За всю дор";
const char * quote = "осилить лишь часть.";
strcat(goldwyn, quote); strcat(samuel, goldwyn); puts(samuel);
return 0;
}
5. Приведенные ниже вопросы позволят попрактиковаться со строками, циклами, указателями и их инкрементированием. Предположим, что имеется такое определение функции:
#include char *pr (char *str)
{
char *pc;
pc = str; while (*pc)
putchar(*pc++); do {
putchar(*—pc);
} while (pc - str); return (pc);
}
Взгляните на следующий вызов функции:
х = pr{"Хо Хо Хо!");
а. Что он выводит?
б. Какой тип должна иметь переменная х?
в. Какое значение получает переменная х?
г. Что означает выражение *—рс, и чем оно отличается от —*рс ?
д. Что будет выведено, если *—рс заменить выражением *рс—?
е. Для чего предназначены два выражения проверки в операторах while?
ж. Что произойдет, если функции pr() передать в качестве аргумента пустую строку?
з. Что придется сделать в вызывающей функции, чтобы pr() можно было использовать так, как показано выше?
6. Предположим, что имеется следующее объявление:
char sign = ‘$';
Сколько байтов памяти занимает переменная sign? Значение ‘$’? Значение "$"?
7. Что выведет следующая программа?
#include
#include
#define Ml "How are ya, sweetie? "
char М2[40] = "Beat the clock.";
char * М3 = "chat";
476 глава 11
int main(void)
{
char words[80];
printf(Ml); puts(Ml); puts(М2); puts(М2 + 1); strcpy(words,М2); strcat(words, " Win a toy."); puts(words); words [4] = '\0'; puts(words); while (*M3) puts(M3++); puts(--M3); puts(--М3);
Читать дальше