当前位置: 首页 > news >正文

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

🐎作者的话

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

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


跳跃式目录

    • 输入函数scanf介绍
    • scanf的作用
    • scanf参数解释
    • 宽度参数
    • 星号忽略符
    • 输入格式问题
    • scanf的返回值
    • VS中如何使用scanf


输入函数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中使用scanf,只需要在源文件第一行加入这一串:

#define _CRT_SECURE_NO_WARNINGS 1

这样就可以消除报错了。

相关文章:

  • TryHackMe-NahamStore(常见web漏洞 大杂烩)
  • 【Java入门】Java数据类型
  • Spring三级缓存
  • 【每日一道智力题】之 轮流取石子(尼姆博弈的详解)
  • linux——高级信号
  • 手把手教你学51单片机-如何学习单片机
  • x86启动流程
  • [ROS2 入门] rqt_console 使用介绍
  • 丝绸之路也可以是科技传播之路
  • 技术分享 | 常用测试策略与测试手段
  • Kinect与TOF、双目、结构光相机比较相机国产、非国产统计参数对比分析
  • 【C语言】动态内存实现通讯录(malloc,calloc,realloc)
  • [MRCTF2020]Ezaudit(随机数的安全)
  • SpringAMQP - 发布订阅模式
  • Understanding LSTM Networks
  • SpringBoot统一功能处理
  • RCNN模型Python实现笔记一
  • STC15系列单片机EEPROM读写示例
  • [GYCTF2020]Blacklist(堆叠注入)
  • SM4算法学习笔记