scanf("%*s %d", g, &h); 中的%*s如何理解
/* 我输入:catch 22 输出:22 分析: scanf("%*s %d", g, &h); 程序跳过%*s,即“catch”,然后把22保存在 g数组第一个元素里面。 printf("%d\n", g[0]); 程序打印出g数组第一个元素的值,即g[0],22*/#include <stdio.h>int main(){ char g[10]; int h; scanf("%*s %d", g, &h); printf("%d\n", g[0]); return 0;}#include <stdio.h>int main(){ int h; sscanf("abc 3", "%*s %d", &h); printf("%d\n", h);}
[解决办法]
%*s控制sscanf读入字符串不进行处理
[解决办法]
scanf("%*s %d", g, &h);
应改为
scanf("%*s%d",&h);
跳过一个不含空白符的字符串。其中空白符可以是' ','\t','\n'之一。
[解决办法]
分析的一部分是对的。
其中%*s确实是使scanf跳过了catch,但%d指定scanf把22存储在g数组的前四个字节中了,而不是只存在了g[0]里,之所以printf打印g[0]得到了22,也是因为%d又指定printf从g[0]开始的地址读了4个字节,从而得到了22。
[解决办法]
抑制字符*的作用是在按格式说明读入数据后不送给任何变量,即“虚读”,举例,scanf("%3d%*2d%3d"),输入12345678后,a=123 b=678,即中间的45,虚读。