最近做到类似于日期的题目,通常可以想用字符串接收,然后再累加算出年月日。
但是最近学到一些小技巧,所以想来总结一下。
当然,通俗的scanf、printf是用来干什么的我就不再介绍了,百度搜一下有很多比我讲得清楚的。
scanf
赋值抑制字符*
比如现在有一个需求,给你一个身份证号,你来算算他今年多少岁了。你可能想着把年份算出来。
scanf里边也可以用通配符,比如下面代码中的scanf," %*6d " 。星号可以理解为赋值抑制字符,他表示从缓冲区中取6个字符,但是不赋值(也就是说不用写参数来接收他)。
int main(){
int yy,mm,dd;
scanf("%*6d%4d%2d%2d%*4d",&yy,&mm,&dd);
printf("%d %d %d\n",yy,mm,dd);
return 0;
}
再比如,给你一个数,去掉第一位数字,输出后面的n-1位数(且忽略前缀0)。
用赋值抑制字符来做非常简单。三行代码搞定。
直接看scanf,从缓冲区中取出第一个位,但是不赋值,然后剩下的n-1位若前缀有0,那么 %d 会自动去掉前缀0。
int w;
scanf("%*1d%d",&w);
printf("%d\n",w);
scanf("%[^\n]%*c",str);
常常会遇到输入有空格的字符串,
这段代码就可以很简单的解决这些问题。
^表示”非”,即读入其后面的字符就结束读入。而后面的%*c则是吸收最后的空格\n。
特别好用,谁用谁知道。
char a[10000];
scanf("%[^\n]%*c",a);
printf("%s\n",a);