前言
scanf函数其实是我们学习编程语言时最常用的语句,奈何我学艺不精,有一些问题在打代码的时候才发现,在此分享下。
一、scanf的用法
scanf的基础用法其实老师在上课的时候都已经讲过,翻翻PPT就能搞定,下面我展示的时我在网络上学习scanf函数时的新发现以及一些类似左右对齐的易忘知识点。
1.*
符
int a = 0, b = 0, c = 0;
scanf("%d%*d%d", &a, &b, &c);
printf("a = %d\nb = %d\nc = %d", a, b, c);
结果:
当输入为:1 2 3时,把1赋予a,2被跳过,3赋予b,c无值可赋
int a = 0, b = 0, c = 0;
scanf("%d%d%*d", &a, &b, &c);
printf("a = %d\nb = %d\nc = %d", a, b, c);
结果:
当输入为:1 2 3时,把1赋予a,2赋予b,3被跳过,c无值可赋
若多输入一个%d
int a = 0, b = 0, c = 0;
scanf("%d%d%*d%d", &a, &b, &c);
printf("a = %d\nb = %d\nc = %d", a, b, c);
结果:
即c被赋予4
2..*
符
在查找时,以下链接是这样写的
【C语言】的%*d、%.*s等详解:
(有些地方这个网站不一定对,我在下文中以标出)
但是我实操之后发现,无论是VS2022还是CodeBlocks,scanf里的“%.*d”
的作用似乎是省略从本位开始后面所有的数字
例如
int a = 0, b = 0, c = 0,d = 0,e = 0,f = 0;
scanf("%.*d%d%d%d%d%d", &a, &b, &c, &d, &e, &f);
printf("a = %d\nb = %d\nc = %d\nd = %d\ne = %d\nf = %d", a, b, c, d, e, f);
而
int a = 0, b = 0, c = 0,d = 0,e = 0,f = 0;
scanf("%d%.*d%d%d%d%d", &a, &b, &c, &d, &e, &f);
printf("a = %d\nb = %d\nc = %d\nd = %d\ne = %d\nf = %d", a, b, c, d, e, f);
int a = 0, b = 0, c = 0,d = 0,e = 0,f = 0;
scanf("%d%d%d%d%.*d%d", &a, &b, &c, &d, &e, &f);
printf("a = %d\nb = %d\nc = %d\nd = %d\ne = %d\nf = %d", a, b, c, d, e, f);
也有人遇到了同样的问题
【C语言】%.*d在scanf()中的用法
目前尚未找到解释
注:以上两个符号对字符与字符串并不适用,可以自己试试看
在printf
中
继续往下挖掘,我发现上面的两个符在printf里却又有不同的用法
(1)*
符
%*d
int a = 1234;
printf("a = %*d",10, a);
结果
当("a = %*d",n, a)
中n大于a的位数时,会在打印a前置空格,直到使总位数=n。
而当n小于a的位数时,则会正常打印。
int a = 1234;
printf("a = %*d",2, a);
结果
这让我想起了右对齐
int a = 1234;
printf("a = %10d", a);
好像结果也一样
####%*f
好像并没有什么用处
在CodeBlocks里也一样
####%*s
(又是一个在vs2022里实现不了的555)
在CodeBlocks里与%*d
相同
(2).*
符
%.*d
int a = 1234;
printf("a = %.*d",10, a);
结果
当("a = %.*d",n, a)
中n大于a的位数时,会在打印a前置0,直到使总位数=n。
而当n小于a的位数时,则会正常打印。
int a = 1234;
printf("a = %.*d",2, a);
结果
%.*f
作用与%.nf
相同
重点%.*s
仍然得靠CodeBlocks实现
作用:截取前n位
总结
好累,今天刚打了班赛,明天还有四节,累鼠了
scanf先写到这里了