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

显然一次只试了一个。
感谢你能提供的任何见解或帮助。

最佳答案

我很惊讶这对你有用:

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

在更紧迫的事情上。。。在C11标准的第7.21.6.2p12节中,在[转换说明符下有一些句子解释:
如果-字符在扫描列表中且不是第一个,则
第二个,其中第一个字符是^,而不是最后一个字符
行为是由实现定义的。
因此,我建议两件事:
您不能依赖0-9可移植地表示扫描集中0123456789字符的范围。最好明确声明0123456789
您的实现并没有像您希望的那样解释-
我建议这样做:
assert(scanf("%[- 0123456789]%*c", buffer) == 1);

您需要检查返回值。如果scanf返回0或EOF,则不能期望使用buffer定义良好。我将-放在扫描集的开头,这样就可以很好地定义它,并将您的0-9扩展到前面提到的0123456789
我希望这有帮助:)

08-16 21:17