Символьные массивы☛Язык программирования C ✎ |
Наиболее распространенным типом массивов в C являются массивы символов. Чтобы проиллюстрировать использование символьных массивов и функций для их обработки, давайте напишем программу, которая читает набор строк текста и печатает длинный. Схема достаточно проста:
while (есть еще одна строка)
if (он длиннее предыдущего длинный)
(Сохранить)
(Сохранить его длину)
вывести длинный строку
Эта схема делает понятным, что программа естественно разделяется на части. Одна часть добываемой новую строку, другая сохраняет его, а остальные руководит процессом.
Поскольку вещи можно так красиво разделить, было бы неплохо написать их именно таким образом. Итак напиши сначала отдельную функцию getline, которая добывать следующую строку ввода. Мы попытаемся сделаем эту функцию полезной и в других контекстах. Менее, getline должна сигнализировать о возможном конец ввода; лучшая конструкция возвращала бы длину строки или нуль, если достигнут конец ввода. Ноль приемлемо указателю конца ввода, поскольку это никогда не может быть действующей длиной строки. Любая строка текста имеет по крайней мере один знак, даже строка, содержащая только символ новой строки, будет иметь длину 1.
Когда мы найдем строку длиннее предыдущего длинный, его надо будет где сохранить. Это наводит на мысль о вторую функцию, copy, которая будет копировать новую строку в надежное место.
И, наконец, нам нужна программа main, для управления getline и copy. Вот что мы получили в результате.
# Include
# Define MAXLINE 1000 / * максимальная длина строки ввода * /
int getline (char line [] int maxline);
void copy (char to [] char from []);
/ * Выводит длинный строка * /
main ()
{
int len; / * длина текущей строки * /
int max; / * самая найдена длина * /
char line [MAXLINE]; / * текущий строка * /
char longest [MAXLINE]; / * длинный строка сохраняется здесь * /
max = 0;
while ((len = getline (line, MAXLINE))> 0)
if (len> max) {
max = len;
copy (longest, line);
}
if (max> 0) / * было найдено строку * /
printf ("% s", longest);
return 0;
}
/ * Getline: считывает строку в s, возвращает длину * /
int getline (char s [], int lim)
{
int c, i;
for (i = 0; i
if (c == '\ n') {
s [i] = c;
+ + I;
}
s [i] = '\ 0';
return i;
}
/ * Copy: копирует from до to; предполагает, что to достаточно большой * /
void copy (char to [] char from [])
{
int i;
i = 0;
while ((to [i] = from [i])! = '\ 0')
+ + I;
}
Функции getline и copy объявлено в самом начале программы, которую, как мы предполагаем, размещен в одном файле.
main и getline общаются через пару аргументов и возвращаемое значение. В getline, аргументы объявлено строкой
int getline (char s [], int lim);
указывающий на то, что первый аргумент s является массивом, а второй, lim - целым числом. Содержание указания размера массива при объявлении заключается в том, что это отводит место для хранения. Длину массива s не обязательно указывать в getline, поскольку размер уже заданы в main. getline использует return, чтобы передать значение обратно вызывающего, так же как мы это видели в функции power. В этой строке также указано, что getline возвращает int; поскольку int - это стандартный тип возврата, его можно было бы опустить.
Некоторые функции возвращают полезные значения - другие, такие как copy, используются только ради их эффекта и не возвращают никаких значений. Типом возврата copy есть void, что явно указывает на то, что никакого значения не возвращается.
getline добавляет символ '\ 0' (нулевой символ, чье ASCII-значение равно нулю) наконец созданного ею массива, для обозначения конца символьного цепочки. Этo преобразования так же применяется в C. Когда цепную стала вроде
"Hello \ n"
появляется в C-программе, ее сохранен как символьный массив, содержащий знаки цепочки и заканчивается символом '\ 0', чтобы обозначить конец цепочки.
+-----+-----+-----+-----+-----+------+------+
| H | e | l | l | o | \ n | \ 0 |
+-----+-----+-----+-----+-----+------+------+
Указатель формата% s функции printf ожидает, что соответствующий аргумент будет цепочкой, представлен именно в этой форме. copy также полагается на тот факт, что ее аргумент ввода заканчивается на '\ 0' и копирует этот знак к выводу.
Мимоходом стоит отметить, что даже такая маленькая программа как эта представляет некоторые сложные проблемы разработки. Например, что должна сделать main в случае, когда она встретит строку, больше установлено ограничение? getline действует безопасно, потому что она перестает набирать знаки, когда массив полный, даже если не было знака новой строки. Проверяя длину и последний возвращен знак, main может определить не был строка слишком длинным, после чего обойтись с ним, как ей заблагорассудится. Ради краткости, мы проигнорировали этот вопрос.
Пользователь getline никак не может знать заранее, которым за длинным будет введен строку, поэтому getline проверяет на предмет переполнения. Противовес, пользователь copy уже знает (или может узнать) длину цепочек, поэтому мы решили проверку на ошибки в нее не добавлять.
Другие материалы по теме:
- Символьные массивы- Типы, операторы и выражения
- Функции и структура программ
- Внешние переменные и область действия
- Введение в c++
