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