Домой / Internet Explorer / 1 описание языка программирования c. §1 Общие сведения о языке. Этапы проектирования программы. Модели жизненного цикла приложений. Сильная или слабая система типов данных

1 описание языка программирования c. §1 Общие сведения о языке. Этапы проектирования программы. Модели жизненного цикла приложений. Сильная или слабая система типов данных

1. Введение

Программирование нуждается в новых универсальных алгоритмических моделях, а аппаратные средства реализуют алгоритмы не только в другой форме, но и на базе другой алгоритмической модели - автоматной. Заимствование технологии из сферы разработки аппаратных средств ключевая идея автоматного программирования. Одна-ко синтез цифровых устройств отличается от программирования. Но, заимствуя модель, с одной стороны, ее не желательно существенно изменять, а, с другой стороны, нельзя не учитывать уже существующую теорию и практику программирования.

Далее мы рассмотрим SWITCH-технологию проектирования автоматных про-грамм, в которой с подобными процессами сталкиваешься сплошь и рядом. С одной стороны, она так изменила модель конечного автомата, что фактически вывела ее за рамки теории автоматов. А, с другой стороны, вводит в программирование понятия, которые с трудом воспринимаются программистами, а, порой, просто являются лишними, т.к. существуют более привычные аналоги из теории программ и практики программирования.

За основу обсуждения проблем автоматного программирования возьмем недавнюю лекцию Шалыто А.А. и его «программные» статьи к определению парадигмы автоматного программирования .

Компьютеры — это, наверное, самые универсальные инструменты, которые человечество имеет в распоряжении. Они способны выполнять невероятные вычисления, они позволяют хранить огромное количество информации, совершенно в разных точках планеты, и при этом легко ею обмениваться, независимо от местонахождения. Компьютеры упрощают многие повседневные задачи, и они позволяют автоматизировать многие рутинные процессы, которые было бы очень утомительно и скучно выполнять человеку. Столько всего могут выполнять компьютеры, но, тем не менее, компьютеры не обладают интеллектом, в отличие от человека. Чтобы автоматизировать даже самый простой процесс, необходимо компьютеру сказать чётко и недвусмысленно, что именно он должен делать. К сожалению наш язык и язык компьютера совершенно не похожи. Таким образом, между машиной и человеком есть серьёзный языковой барьер, который необходимо как-то преодолеть, иначе компьютер нас не поймёт. И пока компьютеры нас не понимают, они самостоятельно ничего делать не будут. Как средство общения между человеком и компьютером, придумано огромное количество языков программирования. С помощью языков программирования, мы создаём программы и компьютер уже непосредственно работает с программами. Сами же программы представляют собой наборы инструкций, которые компьютер может понимать и выполнять.

Типы программ

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

В зависимости от типа проекта, существует множество факторов, которые необходимо учитывать при выборе языка программирования. Вот список наиболее примечательных факторов:

Компиляция, интерпретация и JIT-компиляция

Процесс компиляции переводит код написанный на языке программирования в родной язык целевой машины. Программа, выполняющая этот процесс называется компилятор. Компиляция может заставить код работать достаточно быстро, особенно если компилятор является эффективным при оптимизации. Но дело в том, что полученный код не может работать на различных операционных системах, а также процесс компиляции занимает некоторое время, и чем больше кода — тем дольше процесс компиляции. Стоит отметить, что при внесении каких-то изменений в код программы, необходимо её откомпилировать и только потом запускать.

Интерпретируемые языки программирования читаются программой под названием интерпретатор и выполняются этой же программой. Интерпретируемые языки программирования могут работать на различных ОС, как и интерпретатор и, даже, не имеют длительного времени компиляции. Но программы написанные с помощью интерпретируемых языков, как правило, работают гораздо медленнее, чем эквивалентные, скомпилированные программы.

И наконец,так называемая, компиляция на лету (или JIT-компиляция). Такие языки быстро компилируются, в момент запуска программы. Программы, написанные на JIT-языках, как правило, не оптимизируются, тем самым ускоряется процесс компиляции и восстанавливается баланс между производительностью и кросплатформенностью.

Высокий или низкий уровни программирования

Низкоуровневые языки, в основном, работают непосредственно с оборудованием, и, следовательно, больше всего подходят для написания драйверов устройств. Драйвера — это программы которые управляют оборудованием и имеют непосредственный доступ к нему. Однако, программу, написанную на языке низкого уровня, как правило, трудно портировать на другие платформы. И поэтому для каждой ОС одно и тоже устройство поставляется с различными драйверами. Низкоуровневые языки программирования почти всегда компилируются.

В языках высокого уровня все внимание уделяется концепции языка. То есть такой язык программирования должен быть легок в понимании, например, представление данных в качестве массивов, строк, объектов и т. д. Язык высокого уровня обычно легче понять, чем язык низкого уровня. И, как правило, разработать программу на языке высокого уровня намного проще и быстрее, чем на языке низкого уровня. Как видите, разные уровни программирования предназначены для совершенно разных задач, и не стоит сравнивать функциональность разноуровневых языков, это бессмысленно.

Системы типов данных языков программирования

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

Сильная или слабая система типов данных

Слабая система ввода не ставит никаких ограничений, за этим должен следить программист. Говоря «слабая система данных» я подразумеваю, что язык с такой системой данных строго не регламентирует доступные приведения типов данных. Например, если в функцию умножения вместо числа передать строку или символ, нестроготипизированные языки программирования выполнят такой код, хотя и результат умножения теряет всякий смысл, так как строку на число умножать нельзя. Мало того, результат выполнения этого бессмысленного умножения будет непредсказуем. Если же язык программирования строго-типизированный, то на этапе компиляции, транслятор сообщит об ошибке и прекратит процесс построения проекта. Например,

// пример программы на С++ #include using namespace std; int main(){ char string = "example"; int number = 5; cout << string * number << endl; // умножаем строку на число }

В результате, компилятор сообщит об ошибке:

ошибка: invalid operands of types ‘char ’ and ‘int’ to binary ‘operator*’

То же самое попытаемся сделать в нестрого-типизированном языке программирования — php. Обратите внимание на то, что даже при объявлении переменных тип данных указывать не надо.

Результат выполнения этого кода будет равен нулю. Ошибки никакой не произойдет, хотя казалось бы, умножить строку на число нельзя. Но в языке php все можно. Компилятор языка php не сообщит об ошибке, скрипт сработает и даже выдаст результат, и, если у нас программа состоит из 1000 строк кода, то нам сложно будет найти эту ошибку. Это яркий пример языка программирования со «слабой системой типов данных», то есть, недопущение таких абсурдных операций возлагается полностью на плечи программиста.

Определённый или неопределённый тип данных

Это касается как компилируемых так и интерпретируемых языков. Многие языки требуют явного определения типа переменных, поэтому нет неопределённости, компилятор и интерпретатор чётко знают, что им делать. Некоторые языки программирования, не требуют явного определения типа переменных. Тип данных определяется автоматически, по содержимому переменной.

Статический или динамический тип данных

Если язык статически типизированный, то компилятор/интерпретатор делает проверку типа один раз перед процессом компиляции/интерпретации. Если тип данных динамический, то типы данных проверяются во время выполнения.

Безопасная или небезопасная система типов данных

Возможны ситуации, которые могут привести к непредсказуемому результату или ошибке. Безопасный язык будет вводить по возможности больше ограничений для того, чтобы такие ситуации не возникали. В то время как небезопасный язык всю ответственность возлагает на программиста.

Эти факторы могут характеризовать как один так и несколько языков программирования.

Поддерживаемые парадигмы в программировании

Парадигмы программирования представляют собой методологии или способы программирования, которые поддерживает язык программирования. Вот список основных парадигм:

Декларативная парадигма

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

Функциональная парадигма

Функциональное программирование является подмножеством декларативного программирования, которое пытается решить проблемы с точки зрения математических уравнений и функций. Функциональное программирование рассматривает переменные и объекты как данные, которые не являются общими, в отличие от императивных языков.

Обобщённая парадигма

Обобщенное программирование сосредотачивается на написании алгоритмов в терминах типов данных, которые будут определены. То есть один и тот же алгоритм может работать с различными типами данных. Такой подход может быть очень мощным инструментом, но только в том случае, если хорошо реализован.

Императивная парадигма

Императивные языки позволяют программистам, дать компьютеру упорядоченный список инструкций, которые необходимы для выполнения задачи. Императивные языки программирования противопоставляются декларативным языкам программирования.

Структурная парадигма

Структурные языки программирования направлены на предоставление той или иной формы кода — иерархической структуры. Когда четко просматривается структура кода, то интуитивно становится понятен порядок, в котором выполняются операторы. Такие языки обычно осуждают «прыжки» из одной части кода в другую, например, всем нам известный, оператор goto который определён в языках C и C++.

Процедурная парадигма

Процедурный язык программирования относится к структурным языкам программирования, который поддерживает концепцию процедуры или подпрограммы.

Объектно-ориентированная парадигма

Объектно-ориентированное программирование (иногда сокращенно ООП) является подмножеством структурного программирования, который выражает программы в терминах «объектов». Такая парадигма позволяет коду быть повторно использованным, причём такой подход достаточно прост для понимания.

Стандартизация

Разве языки имеют официальный стандарт? Стандартизация — это очень важно для обеспечения бесконфликтного понимания программы, различными компиляторами/интерпретаторами. Некоторые языки стандартизованы Американским Национальным Институтом Стандартов (ANSI), другие — стандартизированы Международной Организацией по Стандартизации (ISO). Все языки программирования должны быть стандартизированы, иначе не удастся договариваться о том, что правильно, а что не правильно в синтаксисе.

Охарактеризуем язык программирования С++

Теперь, когда мы рассмотрели основные характеристики языков программирования, определим каким факторам удовлетворяет язык программирования C++.

С++ является ISO-стандартизированным языком программирования.

В течение некоторого времени, C++ не имел официального стандарта, однако с 1998 года, C++ был стандартизирован комитетом ISO.

С++ компилируемый язык.

C++ компилируется непосредственно в машинный код, что позволяет ему быть одним из самых быстрых в мире языков.

С++ является строго типизированным языком.

C++ подразумевает, что программист знает, что делает, и позволяет невероятное количество возможностей, ограниченных только лишь фантазией.

С++ поддерживает статические и динамические типы данных.

Таким образом, проверка типов данных может выполняться во время компиляции или во время выполнения. И это ещё раз доказывает гибкость С++.

С++ поддерживает множество парадигм.

C++ поддерживает процедурную, обобщённую, и объектно-ориентированную парадигмы программирования, и многие другие парадигмы.

С++ является портативным языком программирования.

В качестве одного из наиболее часто используемых языков в мире, и как открытый язык, C++ имеет широкий спектр компиляторов, которые работают на различных платформах. Код стандартной библиотеки C++ будет работать на многих платформах.

С++ является полностью совместимым с языком Си

В C++ можно использовать Cи библиотеки и они будут исправно работать.

Язык программирования C++

Последнее обновление: 28.08.2017

Язык программирования С++ представляет высокоуровневый компилируемый язык программирования общего назначения со статической типизацией, который подходит для создания самых различных приложений. На сегодняшний день С++ является одним из самых популярных и распространенных языков.

Своими корнями он уходит в язык Си, который был разработан в 1969-1973 годах в компании Bell Labs программистом Деннисом Ритчи (Dennis Ritchie). В начале 1980-х годов датский программист Бьерн Страуструп (Bjarne Stroustrup), который в то время работал в компании Bell Labs, разработал С++ как расширение к языку Си. Фактически вначале C++ просто дополнял язык Си некоторыми возможностями объектно-ориентированного программирования. И поэтому сам Страуструп вначале называл его как "C with classes" ("Си с классами").

Впоследствии новый язык стал набирать популярность. В него были добавлены новые возможности, которые делали его не просто дополнением к Си, а совершенно новым языком программирования. В итоге "Си с классами" был переименован в С++. И с тех по оба языка стали развиваться независимо друг от друга.

С++ является мощным языком, унаследовав от Си богатые возможности по работе с памятью. Поэтому нередко С++ находит свое применение в системном программировании, в частности, при создании операционных систем, драйверов, различных утилит, антивирусов и т.д. К слову сказать, ОС Windows большей частью написана на С++. Но только системным программированием применение данного языка не ограничивается. С++ можно использовать в программах любого уровня, где важны скорость работы и производительность. Нередко он применяется для создания графических приложений, различных прикладных программ. Также особенно часто его используют для создания игр с богатой насыщенной визуализацией. Кроме того, в последнее время набирает ход мобильное направление, где С++ тоже нашел свое применение. И даже в веб-разработке также можно использовать С++ для создания веб-приложений или каких-то вспомогательных сервисов, которые обслуживают веб-приложения. В общем С++ - язык широкого пользования, на котором можно создавать практически любые виды программ.

С++ является компилируемым языком, а это значит, что компилятор транслирует исходный код на С++ в исполняемый файл, который содержит набор машинных инструкций. Но разные платформы имеют свои особенности, поэтому скомпилированные программы нельзя просто перенести с одной платформы на другую и там уже запустить. Однако на уровне исходного кода программы на С++ по большей степени обладают переносимостью, если не используются какие-то специфичные для текущей ос функции. А наличие компиляторов, библиотек и инструментов разработки почти под все распространенные платформы позволяет компилировать один и тот же исходный код на С++ в приложения под эти платформы.

В отличие от Си язык C++ позволяет писать приложения в объектно-ориентированном стиле, представляя программу как совокупность взаимодействующих между собой классов и объектов. Что упрощает создание крупных приложений.

Основные этапы развития

В 1979-80 годах Бьерн Страуструп разработал расширение к языку Си - "Си с классами". В 1983 язык был переименован в С++.

В 1985 году была выпущена первая коммерческая версия языка С++, а также первое издание книги "Языка программирования C++", которая представляла первое описание этого языка при отсутствии официального стандарта.

В 1989 была выпущена новая версия языка C++ 2.0, которая включала ряд новых возможностей. После этого язык развивался относительно медленно вплоть до 2011 года. Но при этом в 1998 году была предпринята первая попытка по стандартизации языка организацией ISO (International Organiztion for Standartization). Первый стандарт получил название ISO/IEC 14882:1998 или сокращенно С++98. В дальнейшем в 2003 была издана новая версия стандарта C++03.

В 2011 году был издан новый стандарт C++11, который содержал множество добавлений и обогащал язык С++ большим числом новых функциональных возможностей. После этого в 2014 году было выпущено небольшое добавление к стандарту, известное также как C++14. И еще один ключевой релиз языка намечен на 2017.

Компиляторы и среды разработки

Для разработки программ на С++ необходим компилятор - он транслирует исходный код на языке С++ в исполняемый файл, который затем можно запускать. Но в настоящий момент есть очень много различных компиляторов. Они могут отличаться по различным аспектам, в частности, по реализации стандартов. Базовый список компиляторов для С++ можно посмотреть в википедии . Рекомендуется для разработки выбирать те компиляторы, которые развиваются и реализуют все последние стандарты. Так, на протяжении всего руководства преимущественно будет использоваться свободно распространяемый компилятор g++ , разработанный в рамках проекта GNU.

Также для создания программ можно использовать интегрированные среды разработки IDE, такие как Visual Studio, Netbeans, Eclipse, Qt и т.д.

В данной статье функция scanf() рассматривается в общем виде без привязки к конкретному стандарту, поэтому сюда включены данные из любых стандартов C99, C11, C++11, C++14. Возможно, в некоторых стандартах функция работает с отличиями от изложенного в статье материала.

Функция scanf C - описание

scanf() - это функция, расположенная в заголовочном файле stdio.h(C) и cstdio(C++), она также называется форматированным вводом данных в программу. scanf читает символы из стандартного потока ввода (stdin) и преобразует их в соответствии с форматом, после чего записывает в указанные переменные. Формат - означает, что данные при поступлении приводятся к определенному виду. Таким образом, функция scanf C описывается:

scanf("%формат", &переменная1[, &переменная2,[…]]),

где переменные передаются в виде адресов. Причина такого способа передачи переменных в функцию очевидна: в результате работы она возвращает значение, указывающее на наличие ошибок, поэтому единственным способом изменять значения переменных является передача по адресу. Также, благодаря такому способу, функция может обрабатывать данные любых типов.

Некоторые программисты из-за аналогии с другими языками называют функции, подобные scanf() или printf(), процедурами.

Scanf позволяет осуществлять ввод всех базовых типов языка: char, int, float, string и т.д. В случае с переменными типа string нет нужды указывать знак адреса - «&», так как переменная типа string является массивом, и имя ее является адресом первого элемента массива в памяти компьютера.

Формат ввода данных или управляющая строка

Начнем с рассмотрения примера использования функции scanf C из описания.

#include int main() { int x; while (scanf("%d", &x) == 1) printf("%d\n", x); return 0; //требование linux-систем }

Формат ввода состоит из следующих четырех параметров: %[*][ширина][модификаторы] тип. При этом знак «%» и тип являются обязательными параметрами. То есть, минимальный вид формата выглядит следующим образом: “%s”, “%d” и так далее.

В общем случае символы, составляющие строку формата, делятся на:

  • спецификаторы формата - все, что начитается с символа %;
  • разделительные или пробельные символы - ими считаются пробел, табуляция(\t), новая строка (\n);
  • символы, отличающиеся от пробельных.

Функция может оказаться небезопасной.

Используйте вместо scanf() функцию scanf_s().

(сообщение от Visual Studio)

Тип, или спецификаторы формата, или литеры преобразования, или контролирующие символы

Описание scanf C обязано содержать, как минимум, спецификатор формата, который указывается в конце выражений, начинающихся со знака «%». Он сообщает программе тип данных, который следует ожидать при вводе, обычно с клавиатуры. Список всех спецификаторов формата в таблице ниже.

Значение

Программа ожидает ввод символа. Переменная для записи должна иметь символьный тип char.

Программа ожидает ввод десятичного числа целого типа. Переменная должна иметь тип int.

Программа ожидает ввод числа с плавающей точкой (запятой) в экспоненциальной форме. Переменная должна иметь тип float.

Программа ожидает ввод числа с плавающей точкой (запятой). Переменная должна иметь тип float.

7

Программа ожидает ввод числа с плавающей точкой (запятой). Переменная должна иметь тип float.

Программа ожидает ввод восьмеричного числа. Переменная должна иметь тип int.

Программа ожидает ввод строки. Строкой считается набор любых символов до первого встреченного разделительного символа. Переменная должна иметь тип string.

Программа ожидает ввод шестнадцатеричного числа. Переменная должна иметь тип int.

Переменная ожидает ввод указателя. Переменная должна иметь тип указателя.

Записывает в переменную целое значение, равное количеству считанных до текущего момента символов функцией scanf.

Программа считывает беззнаковое целое число. Тип переменной должен быть unsigned integer.

Программа ожидает ввод двоичного числа. Переменная должна иметь тип int.

Набор сканируемых символов. Программа ожидает ввод символов, из ограниченного пула, указанного между scanf будет работать до тех пор, пока на потоке ввода находятся символы из указанного множества.

Символы в строке формата

Символ звездочка (*)

Звездочка (*) - это флаг, указывающий, что операцию присвоения надо подавить. Звездочка ставится сразу после знака «%». Например,

Scanf("%d%*c%d", &x, &y); //игнорировать символ между двумя целыми числами. scanf("%s%*d%s", str, str2); //игнорировать целое число, между двумя строками.

То есть, если ввести в консоли строку «45-20» программа сделает следующее:

  1. Переменной «x» будет присвоено значение 45.
  2. Переменной «y» будет присвоено значение 20.
  3. А знак минус(тире) «-» будет проигнорирован благодаря «%*c».

Ширина (или ширина поля)

Это целое число между знаком «%» и спецификатором формата, которое определяет максимальное количество символов для считывания за текущую операцию чтения.

Следует иметь в виду несколько важных моментов:

  1. scanf прекратит свою работу, если встретит разделительный символ, даже если не считал 20 символов.
  2. Если на ввод подается больше 20 символов, в переменную str будут записаны только первые 20 из них.

Модификаторы типа (или точность)

Это специальные флаги, которые модифицируют тип данных, ожидаемых к вводу. Флаг указывается слева от спецификатора типа:

  • L или l (маленькая L) При использовании «l» со спецификаторами d, i, o, u, x, флаг сообщает программе, что ожидается ввод данных типа long int. При использовании «l» со спецификатором e или f, флаг сообщает программе, что она должна ожидать ввод значения типа double. Использование «L» сообщает программе, что ожидается значение типа long double. Использование «l» со спецификаторами «c» и «s» сообщает программе, что ожидаются двухбайтовые символы типа wchar_t. Например, "%lc", "%ls", "%l".
  • h - флаг, указывающий на тип short.
  • hh - обозначает, что переменная является указателем на значение типа signed char или unsigned char. Флаг можно использовать со спецификаторами d, i, o, u, x, n.
  • ll (две маленькие L) - обозначает, что переменная является указателем на значение типа signed int или unsigned long long int. Флаг используется со спецификаторами: d, i, o, u, x, n.
  • j - обозначает, что переменная является указателем на тип intmax_t или uintmax_t из заголовочного файла stdint.h. Используется со спецификаторами: d, i, o, u, x, n.
  • z - обозначает, что переменная является указателем на тип size_t, определение которого находится в stddef.h. Используется со спецификаторами: d, i, o, u, x, n.
  • t - обозначает, что переменная является указателем на тип ptrdiff_t. Определение на этот тип находится в stddef.h. Используется со спецификаторами: d, i, o, u, x, n.

Более явно картину с модификаторами можно представить в виде таблицы. Такое описание scanf C для програмистов будет понятнее.

Остальные символы

Любые символы, которые будут встречены в формате, будут отбрасываться. При этом стоит отметить, что наличие в управляющей строке пробельных или разделительных символов (новая строка, пробел, табуляция) может приводить к разному поведению функции. В одной версии scanf() будет читать без сохранения любое количество разделителей до момента, пока не встретит символ, отличный от разделителя, а в другой версии - пробелы (только они) не играют роли и выражение "%d + %d" эквивалентно "%d+%d".

Примеры

Рассмотрим ряд примеров, позволяющих поразмыслить и точнее понять работу функции.

Scanf("%3s", str); //если ввести в консоли строку «1d2s3d1;3», в str запишется только «1d2» scanf("%dminus%d", &x, &y); //символы «minus» между двумя числами будут отброшены scanf("%5", str); //ввод символов в str будет происходить до тех пор, пока их не будет 5 и символы являются числами от 0 до 9. scanf("%lf", &d); //ожидается ввод данных типа double scanf("%hd", &x); //ожидается число типа short scanf("%hu", &y); //ожидается число типа unsigned short scanf("lx", &z); //ожидается число типа long int

Из приведенных примеров видно, как меняется ожидаемое число с использованием различных символов.

scanf C - описание для начинающих

Данный раздел будет полезен новичкам. Зачастую нужно иметь под рукой не столько полное описание scanf C, сколько детали работы функции.

  • Функция является отчасти устаревшей. Существует несколько разных реализаций в библиотеках различных версий. Например, усовершенствованная функция scanf S C, описание которой можно найти на сайте microsoft.
  • Количество спецификаторов в формате должно соответствовать количеству переданных функции аргументов.
  • Элементы входного потока должны отделяться только разделительными символами: пробел, табуляция, новая строка. Запятая, точка с запятой, точка и т. д. - эти символы не являются разделительными для функции scanf().
  • Если scanf встретит разделительный символ, ввод будет остановлен. Если переменных для чтения больше одной, то scanf перейдет к чтению следующей переменной.
  • Малейшее несоответствие формата вводимых данных приводит к непредсказуемым результатам работы программы. Хорошо, если программа просто завершится с ошибкой. Но нередко программа продолжает работать и делает это неверно.
  • scanf("%20s …", …); Если входной поток превышает 20 символов, то scanf прочитает первые 20 символов и, либо прекратит работу, либо перейдет к чтению следующей переменной, если она указана. При этом следующий вызов scanf продолжит чтение входного потока с того места, где остановилась работа предыдущего вызова scanf. Если при чтении первых 20 символов будет встречен разделительный символ, scanf прекратит свою работу или перейдет к чтению следующей переменной, даже если не считал 20 символов для первой переменной. При этом все несчитанные символы прицепятся к следующей переменной.
  • Если набор сканируемых символов начать со знака «^», то scanf будет читать данные до тех пор, пока не встретит разделительный символ или символ из набора. Например, "%[^A-E1-5]" будет считывать данные из потока, пока не будет встречен один из символов английского алфавита от А до Е в верхнем регистре или одно из чисел от 1 до 5.
  • Функция scanf C по описанию возвращает число, равное успешному количеству записей в переменные. Если scanf записывает 3 переменные, то результатом успешной работы функции будет возврат числа 3. Если scanf не смог записать ни одной переменной, то результат будет 0. И, наконец, если scanf вообще не смог начать работать по каким-либо причинам, результатом будет EOF.
  • Если функция scanf() завершила свою работу некорректно. Например, scanf("%d", &x) - ожидалось число, а на ввод пришли символы. Следующий вызов scanf() начнет свою работу с того места в потоке ввода, где завершился предыдущий вызов функции. Чтобы преодолеть эту проблему, необходимо избавиться от проблемных символов. Это можно сделать, например, вызвав scanf("%*s"). То есть, функция прочитает строку символов и выбросит ее. Таким хитрым образом можно продолжить ввод нужных данных.
  • В некоторых реализациях scanf() в наборе сканируемых символов недопустимо использование «-».
  • Спецификатор “%c” читает каждый символ из потока. То есть символ -разделитель он также читает. Чтобы пропустить символ разделитель и продолжить читать нужный символ, можно использовать “%1s”.
  • При использовании спецификатора «c» допустимо использовать ширину “%10c”, однако тогда в виде переменной функции scanf нужно передать массив элементов типа char.
  • “%” - это значит "все маленькие буквы английского алфавита", а “%” - значит просто 3 символа: ‘z’, ‘a’, ‘-’. Иными словами, символ «-» означает диапазон только в том случае, если стоит между двумя символами, которые находятся в правильном порядке следования. Если «-» находится в конце выражения, в начале или в неверном порядке символов по обеим сторонам от них, то он представляет собой просто символ дефиса, а не диапазон.

Заключение

На этом завершается описание scanf C. Это хорошая удобная функция для работы в небольших программах и при использовании процедурного метода программирования. Однако главным недостатком является количество непредсказуемых ошибок, которые могут возникнуть при использовании scanf. Поэтому, описание scanf C при програмировании лучше всего держать перед глазами. В крупных профессиональных проектах используются потоки iostream, ввиду того, что обладают более высокоуровневыми возможностями, лучше позволяют отлавливать и обрабатывать ошибки, а также работать со значительными объемами информации. Также следует отметить, описание scanf C на русском доступно на сетевых многих источниках, как и примеры ее использования, ввиду возраста функции. Поэтому при необходимости всегда можно найти ответ на тематических форумах.

Изучение основ и тонкостей языка программирования C++. Учебник с практическими заданиями и тестами. Хотите научиться программировать? Тогда Вы по адресу - здесь бесплатное обучение программированию. Неважно, имеете ли Вы опыт или нет, эти уроки по программированию помогут Вам начать создавать, компилировать и отлаживать программы на языке C++ в разных средах разработки: Visual Studio, Code::Blocks, Xcode или Eclipse.

Множество примеров и подробных разъяснений. Отлично подойдут как для новичков (чайников), так и для более продвинутых. Объясняется всё с нуля и до самых деталей. Эти уроки (200+) дадут Вам хорошую базу/фундамент в понимании программирования не только на С++, но и в других языках программирования. И это абсолютно бесплатно!

Также рассматривается пошаговое создание игры на С++, графическая библиотека SFML и больше 50 задания для проверки своих навыков и знаний в C++. Дополнительным бонусом является .

За репост +20 к карме и моя благодарность!

Глава №0. Введение. Начало работы

Глава №1. Основы C++

Глава №2. Переменные и основные типы данных в C++

Глава №3. Операторы в C++

Глава №4. Область видимости и другие типы переменных в C++

Глава №5. Порядок выполнения кода в программе. Циклы, ветвления в C++