gpt4 book ai didi

c - 如何使用 sscanf 分析字符串数据?

转载 作者:太空宇宙 更新时间:2023-11-04 03:09:54 24 4
gpt4 key购买 nike

仅当字符串匹配以下字符串结构时,如何将字符串拆分为两个字符串(数组名称、索引号):“ArrayName[index]”。数组名最多31个字符,索引最多3个。

我发现以下示例假设与“Matrix[index1][index2]”一起使用。我真的不明白它是如何做到的,以便拆开我需要的部分来获得我的琴弦。

sscanf(inputString, "%32[^[]%*[[]%3[^]]%*[^[]%*[[]%3[^]]", matrixName, index1,index2) == 3

这里的尝试没有成功,我错过了什么?

sscanf(inputString, "%32[^[]%*[[]%3[^]]", arrayName, index) == 2

最佳答案

How do I split a string into two strings (array name, index number) only if the string is matching the following string structure: "ArrayName[index]".

使用 sscanf,您不需要。如果您的意思是在输入与模式不匹配的情况下您可以不依赖任何修改,则不是。这是因为 sscanfscanf 系列的其他成员一样,线性处理其输入和格式,没有回溯,并且根据设计,它会在成功匹配时填充输入字段。因此,如果您使用分配多个字段或尾随文字字符的格式进行扫描,则尽管发生匹配失败,但仍有可能为某些字段存储结果。

但如果你同意,那么 @gsamaras's answer使用 sscanf 提供了一种近乎正确的方法来根据您指定的格式解析和验证字符串。该答案还很好地解释了格式字符串的含义。它的问题在于,它无法区分完全匹配格式的输入和在最后的 ] 处不匹配的输入,或者在后面包含其他字符的输入。

下面是该代码的一个变体,它也解决了这些尾端问题:

  char array_name[32] = {0}, idx[4] = {0}, c = 0;
int n;

if (sscanf(str, "%31[^[][%3[^]]%c%n", array_name, idx, &c, &n) >= 3
&& c == ']' && str[n] == '\0')
printf("arrayName = %s\nindex = %s\n", array_name, idx);
else
printf("Not in the expected format \"ArrayName[idx]\"\n");

格式上的区别是用 %c 指令替换了文字终止 ] ,它匹配任何一个字符,并添加了 %n 指令,这会导致存储到目前为止输入读取的字符数,而不会消耗任何输入。

这样,如果返回值至少为 3,那么我们就知道整个格式都匹配了(a %n 永远不会产生匹配失败,但是文档不清楚并且行为是否不一致它有助于返回的字段计数)。在那种情况下,我们检查变量 c 以确定是否有结束 ] 我们希望找到一个,我们使用 n< 中记录的字符计数 以验证字符串的所有字符都已解析(以便 str[n] 指的是字符串终止符)。

此时您可能想知道这一切是多么复杂和神秘。你这样做是对的。解析结构化输入是一个复杂而棘手的命题,一方面,scanf 系列函数也很难使用。 regex 你会过得更好像你这样的情况的匹配器,或者可能使用机器生成的词法分析器(参见 lex ),可能由机器生成的解析器(参见 yacc )增强。即使是使用字符串函数和字符比较处理输入字符串的手写解析器也可能是一种改进。它仍然很复杂,但这些工具至少可以让它不那么神秘。

注意:上面假设索引可以是最多三个字符的任意字符串。如果您的意思是它必须是数字,也许特别是十进制数,也许特别是非负数,那么可以调整格式以满足该目的。

关于c - 如何使用 sscanf 分析字符串数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57399945/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com