c - 读取和解析之间的区别

标签 c parsing

我在某处读到 scanfC 编程语言解析 数据 ( http://sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html )- 有人可以解释一下这意味着什么 (我尝试用谷歌搜索但无法正确获取)。

最佳答案

“解析数据”意味着您获取一些原始数据并将特定含义放入数据中。

“读取数据”是一个不太具体的术语,但在此上下文中可以指“将原始数据从某些设备获取到您的程序中”。这里的“一些设备”可以是很多东西——它可以是终端 (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 系列函数可以为您做的。在这种情况下:

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

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

如果 sscanf 可以根据这些规则解析数据,它将返回值 2 以告知数据被解析为 2 个变量,变量 name 将保存第一个单词和变量 age 将保存数字。这就是解析的意义所在。

关于c - 读取和解析之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56196357/

相关文章:

c - 为什么我的字符串值会被覆盖?

php - 寻求帮助修复 php 脚本错误

parsing - 在 TLS 协议(protocol)中解析扩展问候消息的正确方法是什么?

c - 设置 PAGE_READONLY(使用 VirtualprotectEx() )时怎么会出现访问冲突?

c - 为什么换行符在导致该字符串的字符串之前的位置未得到打印?

Javascript Date 构造函数无法解析某些时区不带括号的日期字符串

java - 为什么 ANTLR 没有正确打印 token 集?

python - 将 tika 与 python 一起使用,runtimeerror : unable to start tika server

c - CLOCK_REALTIME有什么用?

c - 如何打开文件以在单独的函数中读取而不会出现段错误?