我在某个地方读到scanf在C编程语言中解析数据(http://sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html)- -请有人解释一下这意味着什么(我试着搜索它,但没有正确地得到它)。
发布于 2019-05-18 07:46:05
“分析数据”是指您获取一些原始数据,并在数据中添加特定的含义。
“读取数据”是一个不那么具体的术语,但在这个上下文中,是指“从某个设备获取原始数据到您的程序”。在这里,“某些设备”可以是许多东西--它可以是终端(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);即“解析”数据,即获取一些原始数据(一个数字序列)--将特定意义(语义)放入数据中,同时遵循数据(语法)的一些规则。
这正是扫描族函数可以为你所做的。在这种情况下:
// Parsing
char name[20];
int age;
int result = sscanf(array, "%19s %d", name, &age);在这里,sscanf解析包含在array中的原始数据,并尝试将原始数据映射到一个单词(又名-最大19个字符),然后是一个空格,后面跟着一个数字(又名年龄)。这是格式说明符设置的规则,即字符串"%19s %d"。
如果sscanf能够根据这些规则解析数据,它将返回值2来指示将数据解析为2个变量,变量name将保存第一个单词,变量age将保存该数字。这就是解析的意义所在。
发布于 2019-05-18 05:59:22
如果读取错误,scanf()函数将扫描stdin中的信息,并根据指定的类型修饰符字符(例如,%s、%d、%c)来转换所读取的信息。解析是一种复杂得多的技术,它涉及标记输入,根据上下文无关语法中的集合规则验证输入,并构建抽象语法树来验证输入是否是语言的一部分。
https://stackoverflow.com/questions/56196357
复制相似问题