Нейл Мэтью - Основы программирования в Linux
- Название:Основы программирования в Linux
- Автор:
- Жанр:
- Издательство:«БХВ-Петербург»
- Год:2009
- Город:Санкт-Петербург
- ISBN:978-5-9775-0289-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Нейл Мэтью - Основы программирования в Linux краткое содержание
В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стандартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым.
Для начинающих Linux-программистов
Основы программирования в Linux - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Спецификаторы полей задаются в виде чисел, следующих в спецификаторах преобразований непосредственно за знаком %
. В табл. 3.5 приведены дополнительные примеры использования спецификаторов преобразований и результирующий вывод. Для большей ясности мы применяем знак вертикальной черты, чтобы показать границы вывода.
Таблица 3.5
Формат | Аргумент | Вывод |
---|---|---|
%10s |
"Hello" |
| Hello| |
%-10s |
"Hello" |
|Hello | |
%10d |
1234 |
| 1234| |
%-10d |
1234 |
|1234 | |
%010d |
1234 |
|0000001234| |
%10.4f |
12.34 |
| 12.3400| |
%*s |
10, "Hello" |
| Hello| |
Все приведенные примеры выводятся в поле шириной 10 символов. Обратите внимание на то, что отрицательная ширина поля означает выравнивание элемента по левому краю в пределах поля. Переменная ширина поля обозначается символом "звездочка" ( *
). В этом случае следующий аргумент применяется для задания ширины. Ведущий ноль указывает на вывод элемента с ведущими нулями. В соответствии со стандартом POSIX функция printf
не обрезает поля; наоборот она расширяет поле, чтобы вместить в него аргумент. Например, если вы попытаетесь вывести строку большей длины, чем заданное поле, ширина поля будет увеличена (табл. 3.6).
Таблица 3.6
Формат | Аргумент | Вывод |
---|---|---|
%10s |
"HelloTherePeeps" |
|HelloTherePeeps| |
Функции семейства printf
возвращают целое число, равное количеству выведенных символов. В случае функции sprintf
в него не включается завершающий нуль-символ. При наличии ошибок эти функции возвращают отрицательное значение и задают переменную errno
.
scanf, fscanf и sscanf
Семейство функций scanf
действует аналогично функциям группы printf
за исключением того, что эти функции читают элементы из потока и помещают их в переменные, адреса которых им передаются как параметры-указатели. Для управления преобразованиями ввода функции применяют строку format аналогичным образом и используют многие спецификаторы преобразований функций группы printf
.
#include
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *s, const char *format, ...);
Очень важно, чтобы переменные, используемые для хранения значений, считываемых функциями scanf
, имели корректный тип и точно соответствовали строке формата. Если это не так, используемая память может быть искажена и программа может завершиться аварийно. При этом не будет обнаружено никаких ошибок компиляции. Если повезет, вы можете получить предупреждающее сообщение!
Строка format
функции scanf
и других функций этого семейства, как и в случае функции printf
, содержит как обычные символы, так и спецификаторы преобразований. Но обычные символы применяются для задания символов, которые должны присутствовать во вводе.
Рассмотрим простой пример:
int num;
scanf("Hello %d", &num);
Вызов функции scanf
будет успешным, только если следующие пять символов в стандартном вводе — Hello
. Затем, если следующие символы формируют распознаваемое десятичное число, оно будет считано и присвоено переменной num
. Пробел в строке формата при вводе применяется для игнорирования во вводном файле всех пробельных символов (пробелы, табуляции, переводы страницы и переходы на новую строку) между спецификаторами преобразований. Это означает, что вызов, scanf
будет успешным и поместит 1234 в переменную num
в случае следующих двух вариантов ввода.
Hello 1234
Hellol234
Пробельные символы обычно игнорируются во вводе, когда начинается преобразование. Это означает, что строка формата %d
будет продолжать чтение из вводного файла, пропуская пробелы и переходы на новую строку до тех пор, пока будет продолжаться цифровая последовательность. Если ожидаемые символы отсутствуют, преобразование аварийно завершается и выполнение функции прекращается.
Если не соблюдать осторожность, могут возникнуть проблемы. В вашей программе может появиться бесконечный цикл, если во вводе оставить нецифровой символ при считывании целых чисел.
К другим спецификаторам преобразований относятся следующие:
□ %d
— считывание десятичного целого;
□ %o
, %x
— считывание восьмеричного, шестнадцатеричного целого;
□ %f
, %e
, %g
— считывание числа с плавающей запятой;
□ %c
— считывание символа (пробельный символ не пропускается);
□ %s
— считывание строки;
□ %[]
— считывание множества символов (см. последующее обсуждение);
□ %%
— считывание знака %
.
Как и в случае printf
, у спецификаторов преобразований функции scanf
есть ширина поля, ограничивающая объем ввода. Спецификатор размера ( h
для коротких или l
для длинных целых) показывает, короче или длиннее стандартного получаемый аргумент. Таким образом, %hd
обозначает число типа short int
, %ld
— число типа long int
и %lg
— число с плавающей точкой двойной точности.
Спецификатор, начинающийся со звездочки, указывает на то, что элемент игнорируется. Это значит, что информация не сохраняется, и, следовательно, для ее получения не нужна переменная.
Применяйте спецификатор %c
для чтения одиночного символа во вводе. Он не пропускает начальные пробельные символы.
Используйте спецификатор %s
для чтения строк, но будьте осторожны. Он пропускает ведущие пробельные символы, но останавливается перед первым пробельным символом, встретившимся в строке, поэтому лучше применять его для чтения слов, а не целых строк. Кроме того, длина строки, которую он может прочесть, ограничивается только спецификатором ширины поля, поэтому принимающая строка должна быть достаточной для хранения самой длинной строки из вводного потока.
Лучше применять спецификатор ширины поля или комбинацию функций fgets
и sscanf
для считывания строки ввода, а затем просматривать ее. Это защитит от возможных переполнений буфера, которые может спровоцировать злонамеренный пользователь.
Применяйте спецификатор %[]
для чтения строки, составленной из символов, включенных в множество. Формат %[A-Z]
будет читать строку из прописных букв латинского алфавита. Если в множестве первый символ — знак вставки ( ^
), то спецификатор считывает строку, состоящую из символов, не входящих в множество. Итак, для того чтобы прочитать строку с пробелами, но остановиться на первой запятой, примените спецификатор %[^, ]
.
Интервал:
Закладка: