学习C语言第四天(输入输出)

1. printf()

在学习C语言第一天的博客中,也提到了printf函数,还记得它的全称吗:print format 按照指定格式输出

#include <stdio.h>

int main()
{
	printf("Hello World");
	return 0;
}

默认的print末尾是不会换行的,如果想要换行需要加 \n
在这里插入图片描述
再来看加上\n后的效果
在这里插入图片描述
printf()是在标准库的头文件stdio.h定义的,使用这个函数,必须要引入这个头文件

占位符

占位符的意思就是:这个位置可以用其它值代入

#include <stdio.h>
int main()
{
	printf("我今年%d岁\n", 18);
	return 0;
}

这里的%d就是占位符,表示这个位置用其它值来替换。占位符的第一个字符一律为%,第二个字符表示占位符的类型,这里的%d就表示替换的值是一个整数。
我们还可以用字符串来替换:

#include <stdio.h>
int main()
{	
	printf("我的名字叫%s,我来自广西\n", "秋季");
	return 0;
}

%s 表示替换的是一个字符串,printf()第二个参数就用字符串来替换就好啦

也可以用多个占位符:

#include <stdio.h>
int main()
{
	printf("我的名字叫%s,我今年%d岁\n", "秋季", 18);
	return 0;
}

注意:第二个参数的值不能写反了,比如这里前面%s需要替换的是字符串,但你却给了整数或者别的,那不行,必须要和前面的占位符对应起来

错误演示:
在这里插入图片描述
程序什么都没有输出,还报警告。

关于占位符有很多,大家可以去查看,我这里就不一一举例了

输出格式

printf()允许限定占位符的最小宽度

#include <stdio.h>
int main()
{
	printf("%3d\n", 1);
	return 0;
}

输出效果
在这里插入图片描述
%3d 表示这个占位符的宽度至少是3位。不满3位,会在值的前面添加空格。输出的值默认是右对齐
当然如果超过3位也不会有问题,就正常输出

想要左对齐,需要在%后面加一个-

#include <stdio.h>
int main()
{
	printf("%-3d", 1); //输出:"1  "
	printf("1\n");
	return 0;
}

再来看小数
在这里插入图片描述
它会在前面加4个空格,你自己去试试就知道了,至于为什么3.14后面还有4个0,那是因为小数精度默认是6位,我们这里不够6位所以它补0

限定小数的位数

比如我现在只打印3.14但我不想要后面的0,但是它默认要精确6位怎么办?
在这里插入图片描述
我们只需要在%的后面加上 . 就可以啦,如果想输出3位就.3。这种写法还可以和限定宽度占位符结合使用
在这里插入图片描述
6.2f 表示最小宽度为6,小数位数是2

我们还可以这样 %*.*f
在这里插入图片描述

输出部分字符串

在这里插入图片描述
这些东西大家去试试就知道啦,很简单的

2.scanf()

scanf()函数用于读取用户的键盘输入,当程序运行到这个语句时就会停下来,等待用户从键盘输入
用户输入数据、按下回车后,scanf()才会处理用户输入的数据,将其存入对应的变量中
它的原型也是定义在头文件stdio.h
语法和printf()类似在这里插入图片描述
& 叫做取地址符号,这个一定要有。现在我们来运行看看
在这里插入图片描述
程序报错了,运行不了。来看错误信息:scanf()函数不安全,建议我们使用scanf_s,如果想要这个错误失效需要使用:_CRT_SECURE_NO_WARNINGS

我们需要在.c文件的第一行加上:#define _CRT_SECURE_NO_WARNINGS 1
加上这个就可以使用scanf()函数啦
在这里插入图片描述
为什么不用scanf_s呢?,因为scanf_s是vs这个IDE提供的,并不是C语言标准提供,如果我们使用scanf_s的话,在vs上可以通过编译,但是如果把代码拿去别的编译器,就编译不过去了。这就降低了代码的可移植性

那我们如果要使用scanf(),每次都需要加上不是很麻烦吗?
当然不会啦,交给大家一个可以一劳永逸的解决办法:让每一个创建的.c文件中自动加上:#define _CRT_SECURE_NO_WARNINGS 1

如果你使用的也是VS,那么你的安装路径就会有一个叫:newc++file.cpp这个文件,所有新建的.c/.cpp的文件都是拷贝newc++file.cpp这个文件的;如果我们在这个newc++file.cpp加上:#define _CRT_SECURE_NO_WARNINGS 1以后我们每次创建的.c文件就自动加上啦,视频在我主页,需要的小伙伴可以自行查看

scanf有多少个占位符,就有多少个变量,别忘了&
在这里插入图片描述
需要注意的是scanf()不要加\n,比如这样:

int a = 0;
scanf("%d\n", &a);

scanf()在处理占位符的时候,会自动过滤空白字符,包括空格、换行符等等

scanf()处理用户输入的原理

scanf()处理用户的输入原理是:会把用户输入的数据先放到缓存,等用户按下回车键之后,按照占位符对缓存进行解读。
解读完用户输入,会从上一次解读遗留下来的第一个字符开始,知道读完缓存,或者遇到第一个不符合条件的字符为止。
在这里插入图片描述
我们输入-3.14,然后输出a和b,a的值是-3 b的值是0.140000;为什么?
因为:第一个
scanf()它的格式是%d,第二个scanf()
%f,第一个**scanf()**读到负号(-)还会继续往后面读,因为整数也可以带有负号的对吧;直到遇到了.就停止了,因为整数没有小数点。

第二次调用**scanf()**它是从上一次停止解读的地方继续往后读,所以这次读取的首字符是小数点,一直读到不符合条件为止

scanf()返回值

**scanf()**是有返回值的,返回值是一个整数,表示成功读取的变量个数
在这里插入图片描述
如果没有读取任何项,或者匹配失败,则返回0。如果在成功读取任何数据之前,发生了读取错误或者遇到文件按结尾,则返回常量EOF

EOF 的全称:end of file 文件的结束标志,EOF的本质是-1

占位符

**scanf()的占位符和print()**基本一致,这里就不再多讲了
但是我们主要来看:%c
%c是读取字符,但是不会自动忽略起首的空白字符%c不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格
在这里插入图片描述

在这里插入图片描述
大家可以对比上面这两张图
如果想要跳过空白字符可以在%c的前面加上一个空格

scanf(" %c", &ch);

%s
%s其实不能简单等同于字符串。它的规则是,从当前第一个非空白字符开始读起,遇到空白字符才会结束。
在这里插入图片描述
scanf()遇到%s占位符,会在字符串变量末尾存储一个\0。
另外
scanf()将字符串读入字符数组时,不会检测字符串是否超过了数组的长度,这样可能会超过数组的边界。使用%s占位符,我们可以指定字符串的最长长度。
格式为:
%[m]s
[m]是一个整数,表示读取字符串最大长度,后面的字符就不会读取了。
在这里插入图片描述

赋值忽略符

我们直接看代码:
在这里插入图片描述
如果用竖杠指定格式,那么输入的格式也要相同才可以,所以这里只读取到了2023并没有读到后面的值

但是,每个人的习惯不同,比如别人喜欢用:/ - 来分割呢?那是不是就读不到了。
解决这个问题我们可以使用%*c
在这里插入图片描述
这样就不单单只能用|来分割了

今天就先到这啦,如果有错误的地方欢迎在评论区指出哟~
小伙伴们加油!!!

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值