【问题标题】:Parsing string with sscanf that has a string in it使用包含字符串的 sscanf 解析字符串
【发布时间】:2020-04-28 16:49:22
【问题描述】:

项目在 C 中。我需要解析始终按以下方式格式化的字符串:整数、空格、加号、多字字符串、加号、空格、整数、空格、整数、行尾

示例: 10 +This is 1 string+ 2 -1

我很难弄清楚在 sscanf 的格式中输入什么,以便正确解析被“+”符号包围的字符串,而不包括 + 符号。假设 sscanf 可以用于这种情况。

我尝试了"%d +%s+ %d %d",但没有成功。

【问题讨论】:

  • 请出示您的代码。

标签: c string parsing scanf


【解决方案1】:

您使用%s,但它最多读取第一个空格字符。你想读一串非加号,所以说这是sscanf()应该做的:

"%d +%[^+]+ %d %d"

这是一个扫描集 — 参见 POSIX sscanf()。您还应该保护自己免受buffer overflow 的侵害。如果你有:

char buffer[256];

使用:

"%d +%255[^+]+ %d %d"

注意长度上的一对一——这是scanf() 系列函数的设计特征。您可以通过在格式字符串中的第一个 + 之后放置一个空格来跳过前导空格。不能跳过数据中第二个+ 之前的尾随空格;您必须单独删除它们。

您在第三个数字之后要求“行尾”。这是相当困难的。您可能会使用:

"%d +%255[^+]+ %d %d %n"

传递一个额外的指针到int 参数来保存最后一个被解析字符的偏移量。 %n 之前的空格会跳过空格,包括换行符,所以如果你读入int nbytes;(通过&nbytes),那么你会检查if (buffer[nbytes] != '\0') { …handle trailing garbage… }(但只有在检查你有四个成功的转换规范之后—— %n 转换规范不计入来自sscanf() 等的返回值)。还有其他解决方案;在某种程度上,它们都是肮脏的。

【讨论】:

  • 我读它的方式是行尾的相关性只是最后一个整数之后的内容,但我可能读错了。不顾一切地解决它会为所有人增加额外的学习。
  • 如果在第三个整数之后有额外的材料会发生什么,目前还不清楚。忽略是可能的;抱怨是另一个。这提醒您,输入通常不像您希望或期望的那样干净。
  • Ye old "Hobson's Choice" 回答 SO :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-10
  • 2012-05-04
  • 1970-01-01
相关资源
最近更新 更多