使用scanf()格式化输入

时间:2013-03-06 17:10:59

标签: c scanf

我需要输入一个字符串作为输入,丢弃不是空格,连字符或数字的eveything。换句话说,我只想要读入正整数和负整数。 我对使用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*/

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

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

1 个答案:

答案 0 :(得分:0)

我很惊讶这对你有用:

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. 您的实施并非按照您的意愿解释-
  3. 我建议这样的事情:

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

    需要来检查返回值。如果scanf返回0或EOF,则使用buffer无法预期任何明确定义的内容。我将-放在扫描集的开头,以便明确定义,并将0-9扩展为0123456789,如前所述。

    我希望有帮助:)