C语言萌新如何使用scanf函数?

前言

如果你搜索输入输出函数,那么你会看到输入输出流、Turbo标准库、标准输出端、stdout什么什么乱七八糟的,作为一个萌新,哪懂这些?

本文介绍萌新在前期的学习中,常用的输入输出函数及其功能~


输入函数scanf介绍

函数原型:int scanf(const char * str,地址1,地址2,地址3,地址…)

没错,这就是对于我们C语言新手来说的scanf函数原型,其第一个参数是一个const修饰的字符串其他参数都是地址

scanf的作用

scanf是用来输入数据的,你固然可以在代码的编辑器上输入数据,但是如果你在程序运行以后想要输入一个数据,那就需要用到scanf。

scanf参数解释

对于第一个参数字符串str,你既可以直接用双引号引着放到scanf里面,也可以用字符数组存储后放入数组的首地址,像这样:

int main()
{
	char str[] = "12345";
	scanf(str);
	scanf("12345");
	return 0;
}

这两种存放方法都是可以的。

但是,若想要输入数据,就要在str中加入控制符,其格式是一个**%号加上1个或2个字母**,比如说:%d,%u,%c等等;

每种字母都对应着你要输入不同类型的数据,详细请看下表:

%字母类型
%dsigned int
%uunsigned int
%cchar
%o八进制unsigned int
%x(%X)十六进制unsigned int
%s字符串
%p地址(指针)
%hdshort
%ldlong

每多加一个控制符,就代表着你需要多一个变量来储存你输入的数据,而scanf后面的参数就是用来存储数据的变量的地址,像这样:

int main()
{
	int a = 0;
	char b = 0;

	scanf("%d %c", &a, &b);


	printf("%d %c", a, b);
	return 0;
}

效果图:
在这里插入图片描述
可以看到,我把21和A分别放到a和b里面。

注意:不同类型的控制符是不同存储数据方式,比如说:如果你用%s读取一个int型的数据,那么计算机会把你输入的这个数据当成字符串来存储,像这样:

int main()
{
	int a = 0;

	scanf("%s", &a);
	return 0;
}

效果图:
在这里插入图片描述

可以看到,我输入了123,而计算机把这一串当成字符串来处理,其中31,32,33分别是字符‘1’,字符‘2’,字符‘3’的ASCII码十六进制表示形式

宽度参数

如果你在控制符的%和字母之间输入一个数字,这个数字决定了在读入数据时被允许读入的最大宽度,像这样:

int main()
{
	int a = 0;
	scanf("%5d", &a);
	printf("%d", a);
	return 0;
}

效果图:
在这里插入图片描述
可以看到,a里面只存储了12345。

星号忽略符

星号省略符(博主顾义思名起的名字),其作用是加上这个星号可以忽略一个字符的读入,像这样:

int main()
{
	int a = 0;
	int b = 0;
	scanf("%*d %d", &a, &b);

	return 0;
}

可以看到,第一个控制符里面加了星号,那么你在输入数据时第一个输入的数据就会被忽略

效果图及详解:
在这里插入图片描述

在这里插入图片描述
我们输入12和13,其分别对对应第一个控制符和第二个控制符,第一个控制符读入了12,但是它被忽略了,于是下一个数据13就被读入了a里面,b因为没有数据给他读了,所以还是原来的值。

输入格式问题

在输入时,除了把控制符换成数据以外,必须严格按照str的格式输入,像这样:

int main()
{
	int age = 0;
	scanf("my age is %d", &age);


	return 0;
}

look,我在控制符之前加了一串字符串,那么在输入时,必须严格按照这一串来输入,即你必须把这一串在打一遍。
效果图:
在这里插入图片描述

  • 上图是我们直接输入13,age的值并没有发生变化。

在这里插入图片描述

  • 上图我们按照格式输入,age才有了变化。

这是有利有弊的。

利: 比如有一堆同学,他们的学号都是2023开头的,那么读入数据的时候就可以在控制符前面加上一个2023,这样如果有2022级的学生输入学号时,就可以提示输入错误。
在这里插入图片描述
弊: 这样加格式会让用户的输入更加繁琐,酌情使用。

scanf的返回值

开门见山,scanf的返回值就是正确读入数据的个数,像之前的代码:

int main()
{
	int a = 0;
	int b = 0;
	int tmp=scanf("%*d %d", &a, &b);
	printf("%d", tmp);
}

这里的第一个控制符读入的数据被我们忽略了,所以如果打印tmp,正确输入的数据应该只有一个。
在这里插入图片描述
其次,如果输入错误或输入文件结束符(Ctrl+z),则返回EOF(-1)。

VS中如何使用scanf

在这里插入图片描述
你在VS中使用scanf时可能会遇到这一串错误。
你可以使用scanf_s来替换scanf,不过要多加一个参数,表示数据占用的字节数。
这两者的区别仅仅在于安全性。
如果你想在VS中使用scan,只需要在源文件第一行加入这一串:

#define _CRT_SECURE_NO_WARNINGS 1

这样就可以消除报错了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵千阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值