【问题标题】:sscanf with multiple spaces?sscanf 有多个空格?
【发布时间】:2010-05-24 15:08:51
【问题描述】:

sscanf(text, "%s %s", name, company);

解析'ian mceknis',但它也解析'ian   mceknis'等等。我怎样才能让它只解析第一个?它只能包含一个空格,不能更多。

谢谢。

【问题讨论】:

  • 你能澄清你的问题吗?它解析 X 但它也解析 X?你能举一个更具体的例子吗?
  • 很难看出你在问什么,因为你的两个解析字符串示例是相同的。举一个不起作用的例子。
  • 我只想解析 'ian mceknis blablabla' 'ian mceknis'。但是当字符串包含更多空间时,解析仍然有效。但我不想要这个。它必须仅解析具有指定空格的“ian mceknis”。 'ian mceknis blablabla' 不应该是有效的。我希望你明白我想说的。对不起。

标签: c scanf


【解决方案1】:

如果您希望它拒绝后一个示例,则必须滚动自己的函数来查找/拒绝多个空格。

但我猜你真正想做的是去掉多余的空格。见:How do I trim leading/trailing whitespace in a standard way?

【讨论】:

  • 是的,但字符串仍然是可解析的。这就是为什么我不能这样做。
  • 那么您绝对必须自己进行双倍空格的预检查。你的字符串之前的空格呢?这是允许的吗?最后两个空格呢?另外,这是作业问题吗?因为从可用性的角度来看,通常不太需要限制输入选项。
【解决方案2】:

你不能只使用sscanf(),它具有非常基本的功能。如果您真的需要执行此操作(是吗?),regular expressions 可能更适合这里。

【讨论】:

    【解决方案3】:

    它不是最干净的,但这就是我为一个项目所做的。基本上,它最多需要两个空格,而不是格式化字符串中的空格(您可以将其更改为也处理制表符或其他)。如果只有一个空格,则第二个字符仍为空,如果不为空,则被覆盖。

    所以我会改变:

    sscanf(text, "%s %s", name, company);
    

    到:

    char space[2] = "\0\0"
    sscanf(text, "%s%2[ ]%s", name, space, company);
    if(space[1] != '\0') {
        //there was an extra space, handle it however
    }
    

    【讨论】:

      【解决方案4】:

      根据sscanf的定义,这是绝对不可能的。为了得到想要的结果,我会手动读取文本变量,搜索两个后续的空白字符。如果找到,将第二个空白字符替换为 0,然后调用 sscanf。

      【讨论】:

      • 用'0'替换第二个空格字符只会导致company在给出的示例中设置为0mceknis。 -1.
      • j_random_hacker:你知道0和'0'的区别吗?
      • 我想知道您是否在 nul 字符中表示 0(所有位关闭)。在给出的示例中,这将终止 mceknis 之前的字符串(即输入字符串现在是 ian ,末尾有一个空格)所以 sscanf() 将失败。
      猜你喜欢
      • 1970-01-01
      • 2016-07-09
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多