scanf用法简介

scanf是一个变参函数,参数的数量和类型是不确定的

scanf()是C语言中的一个输入函数。与printf函数一样,都被声明在头文件stdio.h里,因此在使用scanf函数时要加上#include <stdio.h>。

功能

函数 scanf() 是从标准输入流stdin(标准输入设备,一般指向键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中。 

函数参数:

函数的第一个参数是格式字符串,它指定了输入的格式,第二个参数是先把输入的字符串和第一个参数进行匹配然后进行转换,转换完成后,第二个参数表示的就是数据要存放的位置。函数的返回值是int

域宽:

以一个非零的十进制整数形式出现。表示该格式指令最多读入的字符数。

格式说明符:

c 读入域宽指定的数目个字符组成的字符序列(后面不会加上空字节),如果省略宽度则读入单字符。如%c或%1c读入单字符,%2c读入两个字符(后面不会加上空字节),以此类推。

s读入一个的字符序列,后面会加上空字节,遇到空白字符(\t \r \n 空格等)完成读取。

d 读入有符号十进制整数。

u 读入无符号十进制整数。

f  读入有符号浮点数。

o 读入有符号八进制整数。

x,X读入有符号十六进制整数。

p 读入一个指针值。

% 读入% 符号(百分号)

长度修饰符:

hh与d,o, u, x, X配合使用,表示对应一个signed char或unsigned char数据。

h与d,o, u, x, X配合使用,表示对应一个short int或unsigned short int数据。

l 与d,o, u, x, X配合使用,表示对应一个long int或unsigned long int数据,和f配合使用表示对应一个double数据。

ll与d,o, u, x, X配合使用,表示对应一个long long int或unsigned long long int数据。

如:

使用函数时:

第一步: "%d %ld %f %lf"此时中间使用空格间隔,输入时也需要用空格进行分割,scanf是直接把转换结果送到接收变量中,所以使用必须规范。开始输入的字符串和第一个参数对应,假设输入的是1 2 3.0 4.0。1就和"%d"对应,2和%ld对应,3.0和%f对应,4.0和%lf对应。1对应"%d",将转换为int类型的二进制(00000000 00000000 00000000 00000001)表示,int大小4字节。

第二步:把转换得到的二进制放入对应需要存放的空间中,scanf中要求给出变量地址,所以不是数组的一般都要加上&,而对于数组,由于数组名本身就是地址,所以不用&。用对应类型的变量来接收转换结果才能保证结果的准确,否则可能发生如4字节放到2字节里发生截断的情况。

第三步:scanf()函数返回的值为:正确按指定格式输入变量的个数。

例如:

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

如果a和b都被成功读入,那么scanf()的返回值就是2;

如果只有a被成功读入,返回值为1;

如果a和b都未被成功读入,返回值为0;

如果遇到错误或遇到end of file,返回值为EOF。EOF是一个预定义的常量,等于-1。

通过转到定义我们可以看到它的值 

我们可以通过判断它的返回值来实现多组打印,如:

while(scanf("%d%d", &a, &b)!=EOF)

在windows系统中,我们可以通过按下Ctrl+Z和回车键来模拟EOF条件

注意点:

1.printf的参数由于比int小的变量会整形提升,float精度也会升级为double。所以,d可以用于char,short,int。f可以用于float和double。但scanf是直接把转换结果送到接收变量中,所以使用必须规范。

2. scanf函数中没有类似printf的精度控制。

如: scanf("%5.2f",&a); 是非法的。

3.在高版本的 Visual Studio 编译器中,scanf 被认为是不安全的,被弃用,编译器会推荐你使用scanf_s代替 scanf。

但是在C语言标准中并没有’scanf_s’,而这是由VS编译器所提供的,因此在其他编译器中将无法识别’scanf_s’,故在VS编译器中使用’scanf_s’使程序的可移植性大受影响。

我们可以在程序的第一行(开头)使用下面这句话,就可以正常使用scanf

#define _CRT_SECURE_NO_WARNINGS 1

  • 33
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值