读取和解析之间的区别

时间:2019-05-18 05:50:46

标签: c parsing

我在某处阅读了以 C 编程语言{{> 3}解析(http://sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html)的scanf-有人可以解释一下这是什么意思吗(尝试使用Google搜索,但无法正确获取。)

2 个答案:

答案 0 :(得分:4)

“解析数据”意味着您获取了一些原始数据,并在数据中添加了特定含义。

“读取数据”是一个不太具体的术语,但是在这种情况下可以指“从某些设备将原始数据获取到程序中”。这里的“某些设备”可以有很多东西-它可以是终端(stdin),磁盘,网络连接等等。程序可以在不知道数据含义的情况下读取原始数据。该程序将只获得一个数字序列(字节),而不知道这些数字的含义。用伪代码:

 // 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-family函数可以为您完成的工作。在这种情况下,例如:

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

这里sscanf解析array中包含的原始数据,并尝试将原始数据映射到一个单词(又名,最多19个字符),然后是一个空格,再加上一个数字(也就是年龄) )。这是格式说明符设置的规则,即字符串"%19s %d"

如果sscanf可以根据这些规则解析数据,则它将返回值2,以表明数据已解析为2个变量,而变量name将包含第一个单词,变量{ {1}}将保留该数字。这就是解析的目的。

答案 1 :(得分:-2)

您读错了,scanf()函数从stdin扫描信息,并根据指定的类型修饰符(例如%s,%d,%c)转换读取的信息。解析是一种更为复杂的技术,其中涉及对输入进行标记,根据上下文无关文法中的既定规则对输入进行验证,以及构建抽象语法树以验证输入是否为语言的一部分。