hello! 各位宝子们大家好啊,相信大家都多多少少了用过scanf语句吧,但是对scanf函数没有全面的认识仅仅只是知道可以输入。
⛳️今天博主就给大家介绍一下scanf函数,以及在《牛客网》写题时遇到的多组输入该如何解决?
本期文章收录在《C语言初阶篇》,大家有兴趣可以看看呐!
⛺️ 欢迎铁汁们 ✔️ 点赞 收藏 ⭐留言 !
说明:
关于scanf( )我们在C++官网看一下
注:关于scanf的参数类型官网上描述太复杂了,所以博主就不截取了。
- 由博主给大家讲解讲解讲解关键点
scanf 的功能用一句话来概括就是“通过键盘给程序中的变量赋值”。
✅ 函数的原型为:
# include
int scanf(const char *format, ...);
scanf(“输入控制符”, 输入参数);
# include
int main(void)
{
int i;
scanf("%d", &i); //&i 表示变量 i 的地址,&是取地址符
printf("i = %d\n", i);
return 0;
}
那么为什么需要输入控制符呢 ?
使用&取地址操作符的作用
&
是一个取地址运算符,&
后面加变量名表示“该变量的地址”。&i
又称为“取地址i
”,就相当于将数据存入以变量 i
的地址为地址的变量中。注:所以这里scanf 语句的意思就是:从键盘上输入字符 123,然后%d将这三个字符转化成十进制数 123,最后通过 “取地址 i” 找到变量 i 的地址,再将数字 123 放到以变量 i 的地址为地址的变量中。
注:输入参数就是键盘上的字符
输入控制符 | 格式描述 |
---|---|
%d |
整型格式 |
%ld |
长整型格式 |
%lld |
long long 格式 |
%f |
单精度浮点型格式 |
%lf |
双精度浮点型格式 |
%p |
地址的格式 |
%c |
字符格式 |
%s |
字符串格式 |
%p |
地址的格式 |
scanf(“输入控制符非输入控制符”, 输入参数);
这种用法几乎是不用的,也不建议你们使用。
注: 输出控制符,我们前面讲了的大家没记住的可以去看看。
不知道大家理解了嘛? 不理解也没关系演示一边就懂了
咱们是就是说,实践出真理。
代码演示:
# include
int main( )
{
int i;
scanf("i = %d", &i);
printf("i = %d\n", i);
return 0;
}
运行结果:
注:在 printf
中,所有的“非输出控制符”都要原样输出。同样,在 scanf 中,所有的“非输入控制符”都要原样输入。
这是我们本期的重点,想要知道
scanf( )
是如何多组输入的就,必须要弄懂它的返回值。
EOF在C语言中是这样定义的:
- #define EOF (-1)
- 它的意思就是由
#define
定义的EOF为-1
。- 所以当
scanf
返回失败的时候返回的就是-1
。那么怎么样返回错误呢?
ctrl+z
会让scanf
或者getchar
返回EOF就可以啦!- 注:在VS 2022等编译器需要按3次ctrl+z才能返回EOF。
☁️ 首先我们就得了解scanf( )的返回值而上面博主也讲过这样一句话:
scanf( )接收成功的返回值
这是什么意思呢?写一段代码大家就明白了。
# include
int main()
{
int i = 0;
int a = 0;
int ret = scanf("%d%d", &i, &a);
printf("ret = %d\n", ret);
return 0;
}
运行结果:
这估计大家都明白了!哦,原来scanf函数接收成功时返回的是填充的参数列表的项数。
问题引入:
那么想多组输入还不简单吗?直接循环不就完了
- 让它只要没读取错误就一直循环,而返回成功的值我们已经知道了。
int main()
{
int i = 0;
while (scanf("%d", &i) ==1)
{
printf("i = %d\n", i);
}
return 0;
}
scanf( )接收失败的返回值
scanf
返回失败的时候返回的就是EOF
,其实就是返回-1。这不就跟前面一样了嘛?我知道各位聪明的铁汁们一定想到了。
- 只要返回不失败,不就可以多组输入了嘛!
代码演示:
# include
int main()
{
int i = 0;
while (scanf("%d", &i) != EOF)
{
printf("i = %d\n", i);
}
return 0;
}
前面说了scanf返回值是
-1
的。而只有返回值为EOF(-1)的时候其取反(取反操作符~)的值才是0
扩展:原反补的概念
给大家扩展一下一个整数在C语言中存的是他的补码
⛳️ 原码就是它本身转化成二进制
⛳️ 反码按位取反 同0取1 同1取0
⛳️ 补码 反码加1
而-1的补码是:
- -1的原码: 00000000 00000000 00000000 00000001
- -1的反码: 11111111 11111111 11111111 11111110
- -1的补码: 11111111 11111111 11111111 11111111
-1全部取反就是全0,就是0。
而0正好可以作为循环结束的标志!
# include
int main()
{
int i = 0;
while (~scanf("%d", &i))
{
printf("i = %d\n", i);
}
return 0;
}
俗话说,多写多练才能掌握一个知识。
其实博主刚开始学C语言练题的时候就被多组输入给难倒了,但是搜索出来的解答大多讲的
不够细节易懂,所以今天分享给大家的都是最简单易懂的。
注:附带多组输入练习题。
编程初学者入门训练
BC51 三角形判断
BC75 数字三角形
⛳️ 预告一下呢!明天博主就会更新scanf和getchar中的缓冲区概念,所以一点要关注嗷铁汁们!
✅ 归纳:
好了以上就是关于scanf()函数的及其返回值的全部用法了!
scanf的参数
scanf的返回值
EOF的讲解
利用返回值多组输入
利用EOF多组输入
利用 ~ 按位取反操作符多组输入
☁️ 学会这些大家就不会再为,scanf函数的多组输入给逼疯啦!
看到这里了还不给博主扣个 ⛳️ 点赞
☀️收藏
⭐️ 关注
!
❤️
拜托拜托这个真的很重要!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。