|
Программирование >> Структурное программирование
Введите число между О и 2, 3 - окончание: О Вы ввели О, поэтому была вызвана функция 1 Введите число между О и 2, 3 - окончание: 1 Вы ввели 1, поэтому была вызвана функция 2 Введите число между О и 2, 3 - окончание: 2 Вы ввели 2, поэтому была вызвана функция 3 Введите число между О и 2, 3 - окончание: 3 Вы ввели 3 для окончания Рис. 5.28. Демонарация массива указателей на функции (часть 2 из 2) Это объявление читается так: f является массивом трех указателей на функции, которые берут аргумент int и возвращают void . Массив получает в качестве начальных значений имена трех функций. Когда пользователь вводит значения между О и 2, это значение используется в качестве индекса в массиве указателей на функции. Вызов функции выполняется следующим образом, (*f[choice])(choice); В этом вызове f [choice] выделяет указатель, расположенный в элементе массива с индексом choice. Указатель разыменовывается, чтобы вызвать функцию, и choice передается функции как аргумент. Каждая функция печатает значения своих аргументов и имя функции, чтобы показать, что функция вызывается правильно. Мы будем разрабатывать далее системы, управляемые меню, в упражнениях. 5.12. Введение в обработку символов и строк в этом разделе мы познакомимся с некоторыми типичными функциями стандартной библиотеки С, которые обеспечивают обработку строк. Обсуждаемая здесь техника подходит для разработки текстовых редакторов, лин-гвисти>1еских процессоров, программ верстки, систем компьютеризированного набора и других программных систем обработки текстов. 5.12.1. Основы теории символов и строк Символы - это фундаментальные стандартные блоки исходных программ на C-I-I-. Каждая программа составлена из последовательностей символов, которые, если их объединение в группу имеет смысл, интерпретируются компьютером как последовательности инструкций, используемых для выполнения задачи. Программа может содержать символьные константы. Символьная константа - это целое значение, представленное как символ в одинарных кавычках. Значение символьной константы - это целочисленное значение в наборе машинных символов. Например, z представляет собой целое значение z, а \п представляет собой целое значение символа перехода на новую строку. Строка - это последовательность символов, обрабатываемая как единый модуль. Строка может включать буквы, цифры и разнообразные специальные Объявление char со1ог[] = { синий } может быть записано char со1ог[ ] = {с, и, н, и, й, \0}; Когда объявляется массив символов, содержащий строку, он должен быть достаточно большим, чтобы хранить строку и ее завершающий нулевой символ. Предыдущее объявление определяет размер массива автоматически, основываясь на количестве начальных значений в списке. Типичная ошибка программирования 5.12 Не выделяется достаточно меаа в массиве символов для хранения нулевого символа, завершающего ароку. Типичная ошибка программирования 5.13 Создание или использование строки , которая не содержит завершающего нулевого символа. символы, такие как +, -, *, /, $ и другие. Литеральные константы или строковые константы записываются в С-Н- в двойных кавычках следующим образом: John Q.Doe (имя) 9999 Main Street (адрес улицы) Waltham, Massachusetts (город и штат) (201)555-1212 (номер телефона) Строка в С-Н- - это массив символов, оканчивающийся нулевым символом (\0). Строка доступна через указатель на первый символ в строке. Значением строки является адрес ее первого символа. Таким образом можно сказать, что в С-Н- строка является указателем - указателем на первый символ строки. В этом смысле строки подобны массивам, потому что массив тоже является указателем на свой первый элемент. Строка может быть объявлена либо как массив символов, либо как переменная типа char*. Каждое из объявлений char color[ ] = синий ; char *colorPtr = синий ; присваивает переменной строке начальное значение синий . Первое объявление создает массив из 6 элементов color содержащий символы с, и, н, и, й и \0. Второе объявление создает переменную указатель colorPtr, который указывает на строку синий где-то в памяти. Замечание по мобильности 5.4 Когда переменная типа char* получает в качестве начального значения строковую константу, некоторые компиляторы могут поместить ароку в такое место в памяти, где строка не может быть модифицирована. Если у вас может возникнуть необходимость модифицировать ароковую константу, она должна храниться в массиве символов, чтобы обеспечить возможность ее модификации во всех системах. Хороший стиль программирования 5.6 При хранении ароки в массиве символов убедитесь, что массив достаточно велик, чтобы вместить наибольшую строку, которую потребуется хранить. В С++ допускается хранить ароки любой длины. Если строка больше символьного массива, в котором она должна храниться, символы, выходящие за конец массива, будут изменять данные в разделах памяти, следующих за массивом. Строку можно присвоить массиву, используя операцию cin - взять из потока. Например, строку можно присвоить символьному массиву word[20] следующим оператором: cin word; Вводимая пользователем строка хранится в word. Предыдущий оператор считывает символы до тех пор, пока не встретится пробел, символ табуляции, символ новой строки или указатель конца файла. Заметим, что строка не должна быть длиннее 19 символов, чтобы оставить место для завершающего нулевого символа. Манипулятор потока setw, с которым мы познакомились в главе 2, можно использовать для гарантии того, что строка, считанная в word, не превысит размер массива. Например, оператор cin setw(20) word; указывает, что cin должен считать максимум 19 символов в массив word и оставить 20-й символ в массиве для хранения завершающего нулевого символа. Манипулятор потока setw применяется только к следующему вводимому значению символа. В некоторых случаях желательно вводить в массив полную строку текста. С этой целью С++ снабжен функцией cin.getline. Функция cin.getline требует три аргумента - массив символов, в котором должна храниться строка текста, длина и символ-ограничитель. Например, фрагмент программы char sentence[80]; cin.getline (sentence, 80, \n); объявляет ма,орив sentence из 80 символов, затем считывает строку текста с 1#лавиатуры в этот массив. Функция прекращает считывание символов в случаях, если встречается символ-ограничитель \п, если вводится указатель конца файла или если количество считанных символов оказывается на один меньше, чем указано во втором аргументе (последний символ в массиве резервируется для завершающего нулевого символа). Если встречается символ-ограничитель, он считывается и отбрасывается. Третий аргумент cin.getline имеет \п в качестве значения по умолчанию, так что предыдущий вызов функции мог бы быть написан в следующем виде: cin.getline(sentence, 80); В главе 11, Потоки ввода-вывода , детально обсуждается функция cin.getline и другие функции ввода-вывода. Типичная ошибка программирования 5.14 Обработка одного символа как строки. Строка является указателем - это может быть достаточно большое целое. А символ - это небольшое целое (диапазон значений ASCII 0-255). Во многих системах это вызывает ошибку, потому что нижние адреса памяти зарезервированы для специальных целей, таких как обработчики прерываний операционной системы - так что происходит несанкционированный доступ .
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |