您的当前位置:首页正文

scanf家族%*的妙用

2024-11-11 来源:个人技术集锦

最近写程序用到sscanf,发现自己以前对%*这个格式根本没有理解,可见只看书而不进行实际的操作是不能够对问题进行深入的理解。

先看个例子,假设我们输入:

the hour is 10,the minute is 30
而我们只想读取两个数字,通常我们可以分多次读,但是这样比较费事,这时候%*便有用武之地了。

scanf("%*[^0-9]%d%*[^0-9]%d",&h,&m);
*表示跳过[^0-9]所表示的字段,而[^0-9]表示所有的非数字的输入,这样就能够只读取数字了。但是这样有个问题是,如果开始输入的便是数字的话,读取便会失败。这个特性其实是scanf家族的规定:scanf会扫描完其格式串,或者碰到某些输入无法与格式控制说明匹配的情况时,便会终止。函数的返回值是成功匹配并赋值的输入项的个数。如果到达文件末尾,返回EOF,但是EOF与0是不同的,0表示下一个输入字符与格式串中的第一个格式说明不匹配,EOF表示到底了文件末尾。

还有一个例子是读取字符时,%c会读取空格的,一般这不是我们所期望的,这时我们可以这样:

scanf("%1s",&c);
%s表示读取一个字符串,1表示只读取一个字符,这样便实现了读取字符的功能,而且能够跳过空格。

显示全文