C / C ++ sscanf():在转换后的文本后获取指向文本的指针(如果有)

问题描述 投票:0回答:2

[我发誓我已经在职业生涯中完成了100次,并且认为%s做到了,但是我发现没有。

特别是我有

          iParsed = sscanf( pszValue, "%4d-%2d-%2d%c%2d:%2d:%f%s",
                        &stm.tm_year, &stm.tm_mon, &stm.tm_mday, &cSeparator,
                        &stm.tm_hour, &stm.tm_min, &dSec, &pcFollow );

pcFollowconst char*。我只是想知道此日期/时间格式的内容,因此我可以1)检查该点是否附加了可选字段,或者2)抱怨字符串中的垃圾。在其他情况下,我可能要3)继续分析。

%s但是需要char*,而不是char**。它想要一个实际的字符缓冲区来保存我的示例中%f之后的内容的副本。

我唯一的想法是使用%n捕获已解析的字符数,并将其用作pszValue的偏移量。实际上,这很好,只不过这不是我记得的方式。

c scanf
2个回答
0
投票

您可以使用%n格式说明符。它用到目前为止消耗的字符数填充int变量:"%4d-%2d-%2d%c%2d:%2d:%f%s%n"


0
投票

您可以按照以下方式调整现有解决方案:

  1. 根据您的问题和@wilx的回答中的建议,使用格式说明符%n,并将附加的int参数传递给sscanf,以捕获消耗的字符数(这也是任何尾随数据的索引)。
  2. 而不是sscanf const,传递单个char *的地址以检测尾随数据的存在。
  3. 使用char中的返回值来验证已解析的项目数(7将适合您的用例);较小的数字表示分析失败,而较大的数字表示跟踪数据。

这是一个可行的示例(不涵盖所有边缘情况,但应作为起点):

sscanf

样本输出:

sscanf
© www.soinside.com 2019 - 2024. All rights reserved.