【问题标题】:C scanf requested format [duplicate]C scanf请求的格式[重复]
【发布时间】:2018-11-04 22:06:39
【问题描述】:

我需要在我的 C 程序中输入scanf。我是这样做的:

scanf("{[ %lf; %lf],[ %lf; %lf],[ %lf; %lf]}", ...)

但它不适用于某些预期的输入。它必须有效。对于

{[0;0],[10;10],[15;15]}

以及对于

{ [ 4 ; -1 ] , [ 7 ; 1.5],[4; 4] }

但如果某些{ } ; , [ ] 缺失或多余,则需要printf("Bad input.\n")

【问题讨论】:

  • 这看起来像是一个问题,如果一个简单的解析器一次获取每个标记,它会更好地解决这个问题。
  • 有一门课程添加了这种语法。这至少是该主题的第五个问题。一个相关的问答是Trying to tweak sscanf() to ignore \n and \t。基本上,在格式字符串中必须逐字匹配的每个字符之前放置一个空格 — scanf(" { [ %lf ; %lf ] , [ %lf ; %lf ] , [ %lf ; %lf ] }", …),其中%lf 转换规范之前的空格是可选的但对称的(%lf 无论如何都会跳过空格)。另一个问题使用sscanf(),但问题类似。
  • 如果您在任何地方放置空格,例如 int n = scanf(" { [ %lf ; %lf ] , [ %lf ; %lf ] , [ %lf ; %lf ] }", . . .);,那么您的示例都可以工作,并且 scanf 返回 6,您必须始终检查。编辑 - 不是第一个观察到这一点的人。
  • 关于SO的多个问题都在询问这种数据格式,包括:stackoverflow.com/questions/53145987stackoverflow.com/questions/53132823; stackoverflow.com/questions/53042562; stackoverflow.com/questions/53042562; stackoverflow.com/questions/53037182; stackoverflow.com/questions/53034556 — 所有这些都以一种或另一种形式询问相同的“2018 年秋季新 SO”数据格式。
  • @RobertHarvey:不,它不是(相当)JSON。 JSON 将使用逗号,其中使用分号。请参阅:json.org

标签: c validation input scanf


【解决方案1】:

听起来你只是想忽略空格,所以在可能出现空格的地方添加空格:

scanf(" { [%lf ;%lf ] , [%lf ;%lf ] , [%lf ;%lf ] }", ...)

您不需要它的唯一地方是紧接在 %lf 之前,因为该说明符会自动跳过并忽略空格。请务必检查返回值以确保匹配 6 个值。不幸的是,这不会告诉您是否缺少尾随 ]}。为此,您可以在末尾添加一个额外的 %n 说明符并检查以确保它已设置:

int end = 0;
if (scanf(" { [%lf ;%lf ] , [%lf ;%lf ] , [%lf ;%lf ] }%n", ..., &end), end > 0) {
    // successful read
} else {
    // error
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-02
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2016-09-09
    • 2016-11-02
    • 2021-01-21
    相关资源
    最近更新 更多