【问题标题】:formatted input using scanf()使用 scanf() 格式化输入
【发布时间】:2013-03-06 17:10:59
【问题描述】:

我需要将字符串作为输入,丢弃不是空格、连字符或数字的所有内容。换句话说,我只想读入正整数和负整数。 我对使用 scanf 并不执着,但我更喜欢它。

到目前为止我尝试过的是:

char buffer[200];

scanf("%[0-9 ' ']*%c", buffer); /*this works perfectly, except the hyphen part*/
scanf("%[0-9 - ' ']%*c", buffer); /*no change*/
scanf("%[0-9 '-' ' ']%*c", buffer); /*still no change*/

显然一次只尝试其中一个。

感谢您提供的任何见解或帮助。

【问题讨论】:

    标签: c scanf


    【解决方案1】:

    我很惊讶这对你有用:

    scanf("%[0-9 ' ']*%c", buffer);
                     ^--- There's a typo, here. The * should probably be after the %.
    

    关于更紧迫的问题...在 C11 标准中,在第 §7.21.6.2p12 节中,在 [ 转换说明符下,有一些句子可以解释:

    如果 - 字符在扫描列表中并且不是第一个,也不是 第二个,其中第一个字符是 ^,也不是最后一个字符, 行为是实现定义的。

    因此,我建议两件事:

    1. 您不能依赖0-9 可移植地表示扫描集中的字符范围0123456789。你最好明确声明0123456789
    2. 您的实现没有按照您的意愿解释 -

    我建议是这样的:

    assert(scanf("%[- 0123456789]%*c", buffer) == 1);
    

    需要检查返回值。如果 scanf 返回 0 或 EOF,那么您不能期望使用 buffer 进行任何明确定义。我将- 放在扫描集的开头,以便明确定义,并将0-9 扩展为0123456789,如前所述。

    希望对你有帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-24
      • 2015-06-07
      • 1970-01-01
      • 2013-11-14
      相关资源
      最近更新 更多