C++中scanf、printf的特殊用法(持续更新)

最近做到类似于日期的题目,通常可以想用字符串接收,然后再累加算出年月日。

但是最近学到一些小技巧,所以想来总结一下。

当然,通俗的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);

 

你可能感兴趣的:(C/C++,c,c,scanf,printf)