Что такое код sscanf


Ввод данных в языке Си. Функция scanf

Пожалуйста, приостановите работу AdBlock на этом сайте.

Вернёмся к последнему листингу прошлого шага:

Основная задача этого шага научиться получить данные от пользователя.

Для этого можно использовать функцию scanf . Она, так же как и функция printf , описана в заголовочном файле stdio.h . Т.к. он у нас уже подключен в первой строке, то мы можем свободно использовать функцию scanf в своей программе.

Чтобы считать данные, которые ввёл пользователь, и сохранить их в переменную, нужно вызвать функцию scanf со следующими параметрами:

Рис.1. Общий синтаксис функции scanf.

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

Основные спецификаторы формата:

%d — целые числа
%f — вещественное число типа float
%lf — вещественное число типа double (обозначение lf от long float)
%c — символ

Обратите внимание, что в функции scanf для типов float и double используются различные спецификаторы формата.

После формат-строки нужно указать адрес переменной, в которую нужно сохранить данные. Чтобы указать адрес переменной достаточно перед её именем записать знак & (амперсанд), как на рисунке выше.

Напишем, наконец-таки, программу сложения двух чисел.

Скомпилируйте и запустите эту программу. После того, как программа запущена она будет ждать пока вы введёте данные. Мы с вами знаем какие данные нужно вводить, т.к. мы писали эту программу. Для других пользователей, которые код программы не увидят, хорошо бы вывести на экран подсказку, какие данные нужно ввести. Посмотрите как это реализовано в следующем примере.

Эта программа будет полезна тем, кто следит за своим здоровьем. Данная программа подсчитывает уроверь базового обмена веществ по формуле Миффлина-Сан Жеора исходя из данных, которые вы введёте (возраст, рост и вес).

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

Практика

Решите предложенные задачи. Для удобства работы сразу переходите в полноэкранный режим

Исследовательские задачи для хакеров:

  1. Попробуйте удалить в программе Листинг 2 символ & в какой-нибудь функции scanf . Посмотрите какую ошибку выдаст компилятор.
  2. Попробуйте использовать %f для типа double , а %lf для типа float . Каковы результаты? Напишите об этом в комментариях к этому уроку. Не забудьте указать название вашей IDE или компилятора.

Функция scanf

Для считывания данных в языке C используется функция scanf. Ее использование похоже на функцию prinf — сначала задается форматная строка, потом передаются переменные, в которые необходимо записать результат. Например, для считывания двух целых чисел функция вызывается так:

Основное отличие функции scanf в том, что при считывании чисел (или значений типа char) ей необходимо передавать адреса переменных (в языке C все параметры передаются по значению, поэтому чтобы функция scanf могла модифицировать переменную, необходимо передать в функцию адрес этой переменной). Поэтому перед названиями переменных мы пишем знак амперсанда («&»).

В функции scanf могут быть явно записаны какие-то символы, кроме форматных строк. Например, вызов

можно использовать для считывания времени, заданного в виде hh:mm — функция считает число, затем символ двоеточия, затем опять число.

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

Особенности считывания чисел

Функция scanf корректно считывает целые числа, если они начинаются с символа 0, или со знака «+». То есть числа «+123» или «0123» будут корректно считаны по форматной строке «%d», никаких дополнительных параметров задавать не нужно.

Также при считывании чисел игнорируются пробелы перед числом. Это означает, что вызов

scanf(«%d:%d», &a, &b) сможет корректно считать время, заданное в формате hh:mm при наличии пробела после двоеточия (такая запись успешно считает строки «12:34», «01:02», «01:␣23» или «␣01:␣23», поскольку дается указание считать число, затем сразу же двоеточие, затем — число, перед которым могут быть пробелы). Но такая запись не считает выражение, например, вида «01␣:␣23», поскольку после первого числа сразу должно идти двоеточие.

Чтобы считать записать вида «01␣:␣23» можно использовать форматную строку «%d :%d», причем пробел в форматной строке может означать и отсутствие пробелов.

Возможные форматные символы

Возможные форматные символы функции scanf для разных типов данных в целом соответствуют форматным символам для функции printf , но имеют меньше различных модификаторов.

Форматная
строка
Соответствующий ей тип
%hhd Считать число (десятичное) и записать его в переменную типа char (для unsigned char нужно использовать %hhu)
%hd short int (для unsigned short int нужно использовать %hu)
%d int (для unsigned int нужно использовать %u)
%ld long int (для unsigned long int нужно использовать %lu)
%lld long long int (для unsigned long long int нужно использовать %llu)
%f float
%lf double
%Lf long double
char. Считывается один символ, он может быть пробелом или символом конца строки.
%s Считывается последовательность непробельных символов (строка), записывается в C-строку (типа char * или char[])

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

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

Особенность считывания строк

При считывании строки результат записывается в С-строку, которая представляет собой массив символов (или указатель типа char * с выделенной памятью). Поскольку строка в языке C является адресом (указателем) в памяти, где хранится начало строки символов, то передавать в функцию scanf нужно имя переменной без указания амперсанда.

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

Иногда бывает полезно считать всю строку целиком вместе с пробелами до конца строки. Для этого используется функция gets . Например:

Илон Маск рекомендует:  Гибкие SVG элементы

Функция gets считается опасной и не рекомендуется для использования, так как она не контролирует количество считанных символов и не учитывает длину передаваемой строки, что может привести к записи данных за пределами строки.

Вместо нее рекомендуется использование функции fgets , у которой три параметра — строка для записи результата, размер строки и файловый поток, из которого читаются данные. Например:

fgets(s, 101, stdin);

В данном случае мы использовали stdin для чтения со стандартного ввода.

Не следует забывать, что в языке C в конец строки добавляется нулевой символ для обозначения конца строки. То есть если необходимо считать строку, в которой может быть 4 символа, то для нее нужно создать массив char[5] , и функции fgets нужно передавать число, не меньшее 5.

Возвращаемое значение

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

Например, пусть вызвали scanf(«%d:%d», &a, &b) .

Тогда при вводе строки «12:34» функция scanf считает два числа, запишет их в переменные a и b и вернет значение 2. А при вводе «12 34» будет считано только одно число, поскольку после него должно идти двоеточие, то второе число считано не будет и функция scanf вернет значение 1.

Вопрос по c &#8211 Использование scanf для подтверждения ввода пользователя

Я читал статью о Scanf. Я лично никогда не проверял код возврата сканфа.

Мне просто интересно, какие еще методы используют опытные программисты, когда они используют scanf, когда хотят получить пользовательский ввод? Или они используют другую функцию или пишут свои?

Спасибо за любые предложения,

Я думаю, что большинство программистов согласны с тем, что scanf плох, и большинство соглашается использовать fgets и sscanf. Тем не менее, я могу использовать fgets для чтения ввода. Однако, если я нене знаю, что пользователь введет, как я знаю, что анализировать. Например, как если бы пользователь должен был ввести свой адрес, который будет содержать цифры и символы в любом порядке?

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

scanf() для интерактивного ввода пользователя; Я читаю все как текст, используя fgets() , а затем проанализируйте входные данные при необходимости, используя strtol() а также strtod() преобразовать текст в числовые значения.

Один пример того, где scanf() падает, когда пользователь вводит неверное числовое значение, но его начальная часть действительна, что-то вроде следующего:

Если пользователь вводит «12e4″ , scanf() успешно преобразует и назначит12″ чтобы уйтиe4» во входном потоке, чтобы запутать будущее чтение.все вход должен рассматриваться как поддельный, но scanf() Можно’не поймать такого рода ошибки. OTOH, если я сделаю что-то вроде:

Я могу отловить ошибку на входе и отклонить ее перед использованием любой ее части. Это также лучше не оставляет мусор во входном потоке.

scanf() отличный инструментесли Вы можете гарантировать, что ваш вклад всегда будет правильным.

scanf

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

Описание функции имеет вид:

Функция возвращает целочисленное значение — количество считанных элементов, или EOF в случае ошибки.

Управляющая строка содержит спецификаторы, которые позволяют определить тип считываемого значения (аналогичны спецификаторам, используемым с функцией printf: %d, %f, %c и т.д.) и адрес, по которому должно будет записано введенное значение, или, другими словами указатель на переменную, в большинстве случаев адрес — это значок & и символ переменной.

Что такое код sscanf

Для ввода данных в консоли может использоваться функция scanf() . Эта функция определена в заголовочном файле stdio.h (там же, где и функция printf) и имеет следующее формальное определение:

И форматная_строка, и аргументы для функции scanf обязательны.

Форматная_строка содержит спецификации преобразования, которые определяют вводимые данные. Общий вид спецификаций преобразования:

Из этих элементов обязательны только два: знак процента % и спецификатор.

Спецификатор определяет тип вводимых данных:

%c : считывает один символ

%d : считывает десятичное целое число

%i : считывает целое число в любой системе (десятичной, шестнадцатеричной, восьмеричной)

%u : считывает положительное целое число

%e : считывает число с плавающей точкой в экспоненциальной форме

%E : считывает число с плавающей точкой в экспоненциальной форме с заглавным символом экспоненты

%f : считывает число с плавающей точкой

%F : считывает число с плавающей точкой

%g : считывает число с плавающей точкой

%G : считывает число с плавающей точкой

%o : считывает восьмеричное число

%x : считывает шестнадцатеричное число

%X : считывает шестнадцатеричное число

%s : считывает строку

%% : считывает символ процента

Символ звездочки * в спецификации преобразования позволяет пропустить при вводе водимые символы для типа, указанного через спецификатор.

Ширина_поля представляет целое положительное число, которое позволяет определить, какое количество байтов будет учитываться при вводе.

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

h : для ввода значений типа short int ( %hd )

l : для ввода значений типа long int ( %ld ) или double ( %lf , %le )

L : для ввода значений типа long double ( %Lf , %Le )

В качестве аргументов в функцию scanf() передаются адреса переменной, которая будет получать введенное значение. Для получения адреса переменной перед ее именем ставится знак амперсанда & . Например, если переменная называется age , то ее адрес мы можем получить с помощью выражения &age .

Например, введем с консоли числовое значение:

Здесь вводится значение для переменной age, которая представляет тип int , поэтому в форматную строку в функции scanf передается спецификатор %d . Здесь не используется ни символ звездочки, ни ширина поля, ни модификаторы. Вторым параметром идет адрес переменной age — &age .

После ввода значения мы можем его использовать, например, вывести на консоль:

Аналогичен будет ввод данных других типов:

Здесь для имени выделяется 10 символов. Теоретически мы можем ввести и большее количество символов, но чтобы только 10 из них учитывались, в строку форматирования передается ширина поля, которая представляет 10 символов — %10s . Возможный консольный вывод:

Можно сразу вводить несколько значений. В этом случае в качестве разделителя используется пробел:

Отличие scanf от scanf_s

25.11.2013, 17:33

Scanf_s и printf
Доброго времени суток. Я плохо знаю этот язык и у меня вечные проблемы с этими операторами. Вот мой.

Проверка возвращаемого значения scanf_s
Здравствуйте. Помогите пожалуйста сделать проверку возвращаемого значения scanf_s в программке: .

Функция scanf_s не работает нормально с массивом
Во время работы с массивами обнаружил, что не работает, казалось бы корректная программа. В итоге.

Ввод данных, использование функций scanf_s и спецификатора %g
1. В качестве вводимого символа используйте первую букву своей фамилии (латинского алфавита). В.

25.11.2013, 19:02 2 19.03.2020, 21:48 3 19.03.2020, 22:00 4
Илон Маск рекомендует:  Тег tr
19.03.2020, 22:00
20.03.2020, 10:07 5
20.03.2020, 14:54 6

COKPOWEHEU, в данном случае лучше детектить именно мс-ный компиль через _MSC_VER и от этого плясать.

Форматированный ввод данных

В то время как функция printf() осуществляет форматированный вывод данных, функция scanf() осуществляет их форматированный ввод. Это значит, что поступающие на ввод данные преобразуются соответственно указанному формату(ам) и записываются по адресу(ам) указанной(ых) переменной(ых):

Причина, по которой в scanf() передаются адреса, а не значения переменных, очевидна. Функция scanf() должна изменять значения переменных тех функций, из которых вызывается. Единственный способ — это получить адреса областей памяти.

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

Ввод чисел, символов и строк

Пример ввода-вывода целого и вещественного чисел, символа и строки:

Здесь при выполнении программы все данные были введены в одну строку. Разделителем между числами и строками является пробел, а также любой другой символ пустого пространства (например, ‘\n’). Однако при считывании символа, пробел учитывается как символ; чтобы этого не произошло, в примере букву записали сразу после числа. Данные можно было бы ввести, разделяя их переходом на новую строку (опять же при этом надо иметь ввиду, как считывается символ).

В строке формата функции scanf() между спецификациями вполне допустимо поставить пробелы: %d %f %c %s . Они никакой роли не сыграют. Понятно, что данные можно было получить и так:

Обратите внимание, перед переменной str отсутствует знак амперсанда. Это не опечатка. В последующих уроках вы узнаете, что имя массива уже само по себе является ссылкой на массив (другими словами, str содержит адрес начала массива).

В функции scanf() в спецификации формата вещественных чисел не указывается точность представления числа. Запись типа %.3f или %.10lf приведет к невозможности получить вещественное число. Чтобы получить число типа double используют формат %lf, для long double — %Lf.

Для целых чисел: длинное целое — %ld, короткое целое — %hd. Кроме того, существуют спецификации для ввода восьмеричных и шестнадцатеричных чисел.

Функция scanf() возвращает количество удачно считанных данных; т.е. значение, возвращаемое функцией, можно проанализировать и таким образом узнать, корректно ли были введены данные. Например:

Использование обычных символов

В строке формата scanf() допустимо использование обычных символов. В этом случае при вводе данных также должны вводится и эти символы:

В данном случае, когда программа выполняется, ввод должен выглядеть примерно так: 342+1024 = 1366. Знаки «+» и «=» обязательно должны присутствовать между числами, наличие пробелов или их отсутствие абсолютно никакой роли не играет:

Запрет присваивания

Если какие-либо данные, вводимые пользователем, следует проигнорировать, то используют запрет присваивания, ставя после знака %, но перед буквой формата звездочку *. В таком случае данные считываются, но никакой переменной не присваиваются. Это можно использовать, например, когда нет определенной уверенности в том, что поступит на ввод, с одной стороны, и нужды сохранять эти данные, с другой:

Здесь предполагается, что перед каждым числом будет вводится строка, которую следует проигнорировать, например:

Использование «шаблонов»

Для функции scanf() есть пара спецификаций формата, отдаленно напоминающих шаблоны командной оболочки и др. Формат […] позволяет получить строку, содержащую любые символы, указанные в квадратных скобках. Как только на ввод поступает символ, не входящий в указанный набор, считывание данных прекращается. Формат [^…], наоборот, помещает в строку символы, не входящие в указанный набор, до тех пор пока не встретит любой из указанных.

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

А в этом случае строке будет присвоена последовательность символов до любого из указанных знаков препинания:

Некоторые особенности и ограничения функции scanf()

Как только поступают некорректные данные, функция scanf() завершает свою работу. В примере:
scanf ( «%d%f» , & a , & b ) ;

если переменной a попытаться присвоить символ или строку, что невозможно, то переменная bуже обрабатываться не будет. Можно предположить, что так будет надежнее:

Вроде бы неудачное считывание a не должно оказывать никакого влияния на b, т.к. это уже иной вызов scanf() . Но не все так просто: при некорректном вводе данные остаются в буфере и пытаются «навязать» себя последующим вызовам scanf() . Поэтому при использовании scanf() надо думать о том, как в случае некорректного ввода очистить буфер. Например, это можно сделать так, как показано ниже, или путем использования специальных функций (здесь не рассматриваются):

Разделителем данных для scanf() являются символы пустого пространства. Это означает отсутствие возможности записать строку, содержащую неизвестное количество пробелов, в одну переменную, используя только scanf() . Придется использовать либо другую функцию (например, getchar() ), либо создать циклическую конструкцию, считывающую по одному слову и добавляющую его к общей строке.

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

Ввод-вывод в Си

Основной задачей программирования является обработка информации, поэтому любой язык программирования имеет средства для ввода и вывода информации. В языке Си нет операторов ввода-вывода.

Ввод и вывод информации осуществляется через функции стандартной библиотеки. Прототипы рассматриваемых функций находятся в файле stdio.h . Эта библиотека содержит функции

  • printf() — для вывода информации
  • scanf() — для ввода информации.

Вывод информации

Функция printf() предназначена для форматированного вывода. Она переводит данные в символьное представление и выводит полученные изображения символов на экран. При этом у программиста имеется возможность форматировать данные, то есть влиять на их представление
на экране.

Общая форма записи функции printf() :

СтрокаФорматов состоит из следующих элементов:

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

Объекты могут отсутствовать.

Управляющие символы не выводятся на экран, а управляют расположением выводимых символов. Отличительной чертой управляющего символа является наличие обратного слэша ‘\’ перед ним.

Основные управляющие символы:

  • ‘\n’ — перевод строки;
  • ‘\t’ — горизонтальная табуляция;
  • ‘\v’ — вертикальная табуляция;
  • ‘\b’ — возврат на символ;
  • ‘\r’ — возврат на начало строки;
  • ‘\a’ — звуковой сигнал.

Форматы нужны для того, чтобы указывать вид, в котором информация будет выведена на экран. Отличительной чертой формата является наличие символа процент ‘%’ перед ним:

  • %d — целое число типа int со знаком в десятичной системе счисления;
  • %u — целое число типа unsigned int ;
  • %x — целое число типа int со знаком в шестнадцатеричной системе счисления;
  • %o — целое число типа int со знаком в восьмеричной системе счисления;
  • %hd — целое число типа short со знаком в десятичной системе счисления;
  • %hu — целое число типа unsigned short ;
  • %hx — целое число типа short со знаком в шестнадцатеричной системе счисления;
  • %ld — целое число типа long int со знаком в десятичной системе счисления;
  • %lu — целое число типа unsigned long int ;
  • %lx — целое число типа long int со знаком в шестнадцатеричной системе счисления;
  • %f — вещественный формат (числа с плавающей точкой типа float );
  • %lf — вещественный формат двойной точности (числа с плавающей точкой типа double );
  • %e — вещественный формат в экспоненциальной форме (числа с плавающей точкой типа float в экспоненциальной форме);
  • %c — символьный формат;
  • %s — строковый формат.

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

Результат работы программы

Тот же самый код может быть представлен с использованием одного вызова printf :

Функция стандартного ввода scanf()

Функция scanf() — функция форматированного ввода. С её помощью вы можете вводить данные со стандартного устройства ввода (клавиатуры). Вводимыми данными могут быть целые числа, числа с плавающей запятой, символы, строки и указатели.

Функция scanf() имеет следующий прототип в файле stdio.h:
int scanf(char *управляющая строка);

Функция возвращает число переменных которым было присвоено значение.

Управляющая строка содержит три вида символов: спецификаторы формата, пробелы и другие символы. Спецификаторы формата начинаются с символа %.

Спецификаторы формата:

%c чтение символа
%d чтение десятичного целого
%i чтение десятичного целого
%e чтение числа типа float (плавающая запятая)
%h чтение short int
%o чтение восьмеричного числа
%s чтение строки
%x чтение шестнадцатеричного числа
%p чтение указателя
%n чтение указателя в увеличенном формате

При вводе строки с помощью функции scanf() (спецификатор формата %s), строка вводиться до первого пробела!! т.е. если вы вводите строку «Привет мир!» с использованием функции scanf()

char str[80]; // массив на 80 символов
scanf(«%s»,str);

то после ввода результирующая строка, которая будет храниться в массиве str будет состоять из одного слова «Привет». ФУНКЦИЯ ВВОДИТ СТРОКУ ДО ПЕРВОГО ПРОБЕЛА! Если вы хотите вводить строки с пробелами, то используйте функцию

char *gets( char *buf );

С помощью функции gets() вы сможете вводить полноценные строки. Функция gets() читает символы с клавиатуры до появления символа новой строки (\n). Сам символ новой строки появляется, когда вы нажимаете клавишу enter. Функция возвращает указатель на buf. buf — буфер (память) для вводимой строки.

Хотя gets() не входит в тему этой статьи, но всё же давайте напишем пример программы, которая позволяет ввести целую строку с клавиатуры и вывести её на экран.

void main(void)
<
char buffer[100]; // массив (буфер) для вводимой строки

gets(buffer); // вводим строку и нажимаем enter
printf(«%s»,buffer); // вывод введённой строки на экран
>

Ещё одно важное замечание! Для ввода данных с помощью функции scanf(), ей в качестве параметров нужно передавать адреса переменных, а не сами переменные. Чтобы получить адрес переменной, нужно поставить перед именем переменной знак &(амперсанд). Знак & означает взятие адреса.

Что значит адрес? Попробую объяснить. В программе у нас есть переменная. Переменная хранит своё значение в памяти компьютера. Так вот адрес, который мы получаем с помощью & это адрес в памяти компьютера где храниться значение переменной.

11) Условный оператор if-else в C++

Если вопрос касается задач разветвляющегося процесса, то здесь необходимо использовать условный оператор if-else. В этой статье вы узнаете, как работаетусловный оператор if-elseв C++ и разберем одну задачу на эту тему.

Допустим, у нас имеется задача, в которой нужно определить какое из трех чисел введенных с клавиатуры является самым большим? Для решения такой задачи нам как раз таки и понадобится использование условного оператор if-else .

В общем виде этот оператор выглядит так:

Если у нас «условие» является истинным выражением или значением, то выполняется оператор_1 иначе, если у нас «условие» ложно, то выполняется оператор_2.

А если мы хотим задать группу операторов для истинного или ложного условия? Тогда это будет выглядеть так:

При условии если у нас имеется группа операторов, то их мы помещаем в фигурные скобки.

А теперь задачка:

Решение:

Эту задачу можно решать по крайне мере двумя способами. И сейчас я вам о них расскажу.

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: При сдаче лабораторной работы, студент делает вид, что все знает; преподаватель делает вид, что верит ему. 9340 — | 7295 — или читать все.

188.64.174.135 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

Отключите adBlock!
и обновите страницу (F5)

очень нужно

Что это за код для scanf?

Я просматривал код загрузки моего друга obj. Он сделал это в C++; код:

Когда я проверил это, загрузив файл obj, он был открыт правильно. Однако я не понимаю первый аргумент sscanf() , а именно: &STREAM[&t[0]-&STREAM[0]-10] . Пожалуйста, объясните, как это работает?

t будет указывать на позицию подстроки «vertices» , внутри STREAM .

&t[0] — адрес первого символа в «vertices» . Эквивалент t себя. То же самое относится к &STREAM[0] , это адрес первого символа STREAM . Вычитая их, вы получаете начальный индекс t .

Поэтому ваш друг хочет прочитать от STREAM , начиная с десяти символов до t .

Все это гораздо более четко выражено простым t — 10 .

Я не знаю, почему так было, но

Это 10 символов перед началом «вершин» (и «лиц»)

Ваш друг часто участвует в каких-то обфускационных соревнованиях C?

&t[0] берет адрес первого байта в *t . Этот адрес конечно, что t уже содержит.

Аналогично для &STREAM[0] , который совпадает с адресом STREAM .

Итак, &t[0]-&STREAM[0] вычисляет количество байтов (символов) между t и началом STREAM . Если вы используете это как индекс в STREAM и берете адрес этого байта &STREAM[&t[0]-&STREAM[0]] — снова вы получаете адрес, который уже был в t .

И если вы вычесть 10 байт из этого, &STREAM[&t[0]-&STREAM[0]-10] , вы получите t — 10 .

& STREAM [& t [0] — & STREAM [0] -10] = & STREAM [addressof (t [0]) — addressof (STREAM [0]) — 10]. Он дает смещение t в STREAM минус 10. Запись t — 10 была бы одинаковой, зная, что t и STREAM являются указателями в одном буфере.

Посмотрите другие вопросы по метке c++ или Задайте вопрос

Илон Маск рекомендует:  Что такое код asp aspthreadgateenabled
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL