Разница между чтением и разбором - PullRequest
0 голосов
/ 18 мая 2019

Я где-то читал, что scanf на C языке программирования анализирует данных (http://sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html)- Может кто-нибудь объяснить, что это значит (я пытался гуглить, но не мог не понял правильно).

Ответы [ 2 ]

4 голосов
/ 18 мая 2019

«Анализ данных» означает, что вы берете некоторые необработанные данные и вводите в данные конкретное значение.

«Чтение данных» - это менее конкретный термин, но в данном контексте он может означать «получение необработанных данных в вашу программу с какого-либо устройства». Здесь «какое-то устройство» может быть многим - это может быть терминал (стандартный), диск, сетевое соединение и так далее. Программа может читать необработанные данные, не зная, что эти данные означают. Программа просто получит последовательность чисел (байтов), не зная, что означают эти числа. В псевдокоде:

 // READ DATA
 unsigned char array[some-size];
 size_t index = 0;
 while(input-device-has-data)
 {
     array[index] = get-input-from-device();
     ++index;
 }

После этого цикла, который читает данные, массив может содержать:

array[0]: 74
array[1]: 79
array[2]: 69
array[3]: 32
array[4]: 52
array[5]: 50
array[6]: 0

Последовательность чисел, которая на самом деле ничего не значит. Поэтому следующим шагом является настройка некоторых правил для данных, чтобы сделать их осмысленными. Первый шаг - это кодирование, то есть, что означает число 74? Одной из таких кодировок является таблица ascii, которая определяет, как числа переводятся в символы. Используя таблицу ascii, вышеприведенные числа становятся:

array[0]: J
array[1]: O
array[2]: E
array[3]: space
array[4]: 4
array[5]: 2
array[6]: NUL

Затем вы можете установить правила для данных, которые ваша программа должна получать. В этом простом примере правило будет выглядеть примерно так: name age

Итак, в вашей программе вы захотите «преобразовать необработанные данные» в две переменные. Одна переменная, которая содержит имя, и другая переменная, которая содержит возраст. В псевдокоде:

string name = get_name(array);
int age = get_age(array);

То есть «для анализа» данных, т. Е. Взять некоторые необработанные данные (последовательность чисел), внести в данные конкретное значение (семантическое), соблюдая при этом некоторые правила для данных (синтаксис).

И это именно то, что функции семейства scanf могут сделать для вас. В этом случае, как:

// Parsing
char name[20];
int age;
int result = sscanf(array, "%19s %d", name, &age);

Здесь sscanf анализирует необработанные данные, содержащиеся в array, и пытается отобразить необработанные данные в слово (так называемое имя - не более 19 символов), за которым следует пробел, за которым следует число (также называемое возрастом). Это правила, которые устанавливает спецификатор формата, то есть строка "%19s %d".

Если sscanf может проанализировать данные в соответствии с этими правилами, он вернет значение 2, чтобы сказать, что данные были проанализированы в 2 переменные, а переменная name будет содержать первое слово, а переменная age будет содержать число. Вот что такое разбор.

0 голосов
/ 18 мая 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...