首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >阅读与句法分析的区别

阅读与句法分析的区别
EN

Stack Overflow用户
提问于 2019-05-18 05:50:46
回答 2查看 1.6K关注 0票数 0

我在某个地方读到scanfC编程语言中解析数据(http://sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html)- -请有人解释一下这意味着什么(我试着搜索它,但没有正确地得到它)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-18 07:46:05

“分析数据”是指您获取一些原始数据,并在数据中添加特定的含义。

“读取数据”是一个不那么具体的术语,但在这个上下文中,是指“从某个设备获取原始数据到您的程序”。在这里,“某些设备”可以是许多东西--它可以是终端(stdin)、磁盘、网络连接等等。程序可以读取原始数据,而不知道数据的含义。程序只会得到一个数字序列(字节),而不知道这些数字意味着什么。在伪码中:

代码语言:javascript
复制
 // READ DATA
 unsigned char array[some-size];
 size_t index = 0;
 while(input-device-has-data)
 {
     array[index] = get-input-from-device();
     ++index;
 }

在读取数据的循环之后,数组可能包含:

代码语言:javascript
复制
array[0]: 74
array[1]: 79
array[2]: 69
array[3]: 32
array[4]: 52
array[5]: 50
array[6]: 0

一系列的数字看起来并不意味着什么。因此,下一步是为数据设置一些规则,以使其有意义。第一步是编码,即74是什么意思?这样的编码之一是定义数字如何转换为字符的ascii表。使用ascii表,上面的数字变成:

代码语言:javascript
复制
array[0]: J
array[1]: O
array[2]: E
array[3]: space
array[4]: 4
array[5]: 2
array[6]: NUL

然后,您可以为您希望程序接收的数据设置规则。在这个简单的例子中,规则应该是:name age

因此,在您的程序中,您将希望“将原始数据”转换为两个变量。一个变量保存名称,另一个变量保存年龄。在伪码中:

代码语言:javascript
复制
string name = get_name(array);
int age = get_age(array);

即“解析”数据,即获取一些原始数据(一个数字序列)--将特定意义(语义)放入数据中,同时遵循数据(语法)的一些规则。

这正是扫描族函数可以为你所做的。在这种情况下:

代码语言:javascript
复制
// Parsing
char name[20];
int age;
int result = sscanf(array, "%19s %d", name, &age);

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

如果sscanf能够根据这些规则解析数据,它将返回值2来指示将数据解析为2个变量,变量name将保存第一个单词,变量age将保存该数字。这就是解析的意义所在。

票数 4
EN

Stack Overflow用户

发布于 2019-05-18 05:59:22

如果读取错误,scanf()函数将扫描stdin中的信息,并根据指定的类型修饰符字符(例如,%s、%d、%c)来转换所读取的信息。解析是一种复杂得多的技术,它涉及标记输入,根据上下文无关语法中的集合规则验证输入,并构建抽象语法树来验证输入是否是语言的一部分。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56196357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档