1

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

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

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

4

1 回答 1

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. 您的实现没有-按照您的意愿进行解释。

我建议这样的事情:

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

需要检查返回值。如果scanf返回 0 或EOF,那么您不能期望使用buffer. 我把它放在-扫描集的开头,这样它就被很好地定义了,并像前面提到的那样扩展了你0-9的。0123456789

我希望这会有所帮助:)

于 2013-04-27T17:52:08.423 回答