鱼C论坛

 找回密码
 立即注册
查看: 36920|回复: 68

[函数快查] scanf -- 格式化输入

  [复制链接]
发表于 2015-12-24 21:52:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
scanf 函数文档


函数概要:

scanf 函数从标准输入流中读取格式化字符串。

printf 格式化输出函数相反,scanf 函数是格式化输入函数。


函数原型:

  1. #include <stdio.h>
  2. ...
  3. int scanf(const char *format, ...);
复制代码


参数解析:

1、format 参数

format 参数是一个格式化字符串,由格式化占位符和普通字符组成。

该格式化字符串指定如何处理读取到的数据:

  • 空白字符:该函数将读取并忽略空白字符(空白字符包含空格、回车和制表符);
  • 除了格式占位符(% 开头)外的非空白字符:指定函数必须从输入流中读取到的字符,如果读取不匹配,则函数调用失败,并从匹配失败处截断输入流;
  • 格式化占位符(% 开头):用于指明获取的数据类型及位置。

格式化占位符的语法如下:

%[width][length]specifier

每一个格式化占位符均以 % 开始,以转换字符结束。


specifier转换字符,必选)的内容及含义如下:

转换字符
含义
c
读取一个字符
d
读取一个十进制整数,前边可以加上符号(+ 或 -)表示正负
i
1. 读取一个整数,前边可以加上符号(+ 或 -)表示正负
2. 0 开头表示八进制数,0x 开头表示十六进制数
e
读取一个以指数形式的单、双精度浮点数(小写 e)
E
同上(大写 E)
f
读取一个单、双精度浮点数(需要使用 lf),前边可以加上符号(+ 或 -)表示正负
g
同 f、e、E
G
同上(指数显示大写 E)
a
读取一个十六进制的浮点数(以 0x 或 0X 开头)
o
读取一个八进制整数,前边可以加上符号(+ 或 -)表示正负
s
读取一连串字符,直到遇到空白字符结束。
u
读取一个无符号的十进制整数
x
1. 读取一个十六进制整数,前边可以加上符号(+ 或 -)表示正负
2. 十六进制数以 0x 或 0X 开头
p
读取一个指针的值
[characters]
1. 匹配中括号括起来的字符集
2. 可以用小横杆(-)表示范围,比如 [0-9]
[^characters]
1. 匹配除了中括号括起来的字符集
2. 可以用小横杆(-)表示范围,比如 [0-9]
n
1. 存放已经读取的字符个数
2. 不消耗任何标准输入流的字符
%
表示匹配 % 自身

注1:除了 n,其他的每次读取都会至少消耗标准输入流中的一个字符。

注2:如果读取失败,则标准输入流截断于读取失败的位置。

星号(*)、width 和 length 是可选的。

  • 星号(*)表示读取但忽略(读取但不保存);
  • width 指定当前读取操作的最大字符数;
  • length 是用于限定不同类型的宽度,具体请参考下表:

length
d 或 i
u、o 或 x
f、e、g 或 a
c、s、[] 或 [^]
p
n
默认
int*
unsigned int*
float*
char*
void**
int*
hh
signed char*
unsigned char*
signed char*
h
short int*
unsigned short int*
short int*
l
long int*
unsigned long int*
double*
wchar_t*
long int*
ll
long long int*
unsigned long long int*
long long int*
j
intmax_t*
uintmax_t*
intmax_t*
z
size_t*
size_t*
size_t*
t
ptrdiff_t*
ptrdiff_t*
ptrdiff_t*
L
long double*

小甲鱼温馨提示:因为整理自官方文档,所以出现了很多暂时你还不认识的东东,不用怕,暂时忽视他们即可……


2、... 附加参数

该参数的个数由格式化字符串决定。

每个参数均为一个存储空间,并与面格式化字符串中占位符的类型和位置一一对应。

如果是一个普通的变量名,应在其名字前边加上 & 符号。


返回值:

如果函数调用成功,返回值是成功获取并填充到附加参数中的个数。

如果函数调用失败,返回值小于附加参数的个数(甚至是 0)。

如果读取到标准输入流的结尾处,则返回 EOF。


演示:

  1. #include <stdio.h>

  2. int main()
  3. {
  4.         char c;
  5.         int i;
  6.         int j;

  7.         scanf("%c%d%x", &c, &i, &j);
  8.         printf("变量c的值是:%c\n", c);
  9.         printf("变量i的值是:%d\n", i);
  10.         printf("变量j的值是:%#X(%d)\n", j, j);

  11.         return 0;
  12. }
复制代码

搜狗截图20151225132508.png

版权归鱼C工作室(www.fishc.com)所有,转载请注明来源!

评分

参与人数 6荣誉 +18 鱼币 +19 贡献 +11 收起 理由
Cn1973 + 5 + 1 + 1 无条件支持楼主!
WindRoa + 5 一二题我用的另一个函数,没有想过这个之前.
萌笨笨萌 + 5 + 5 + 3 鱼C有你更精彩^_^
蒋博文 + 1 + 1 无条件支持楼主!
sjm20010512 + 1 + 1 + 1
zltzlt + 6 + 6 + 6

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2016-1-17 17:41:11 | 显示全部楼层
cin
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2016-2-18 19:56:59 | 显示全部楼层
赞一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2016-4-12 22:14:57 | 显示全部楼层
,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2016-5-27 13:40:34 | 显示全部楼层
会用,半懂。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2016-6-20 19:58:03 | 显示全部楼层
附加参数里边说,如果是普通变量名,之前加&
何为普通变量名??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2016-8-7 17:26:18 | 显示全部楼层
学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2016-8-9 18:20:30 | 显示全部楼层
学习,学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2016-8-11 09:48:01 | 显示全部楼层
看看 学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2016-11-14 21:01:33 | 显示全部楼层

哈哈哈爽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2016-12-1 17:06:32 | 显示全部楼层
感觉c语言打的代码量好多  Python就简洁多了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2017-1-3 15:59:48 | 显示全部楼层
好好学
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2017-4-20 11:49:00 | 显示全部楼层
scanf其实和C++里面的cin<<差不多,就是前者打起来很费劲。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2017-8-10 15:30:32 | 显示全部楼层
aa
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2017-9-14 21:32:38 | 显示全部楼层
返回值的意思有点模糊,意思是scanf(%d)的话,如果只输入abcdef。。返回值就一定是0.只要输入了数字,返回值就一定是1?这样解释吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2017-11-19 14:24:39 | 显示全部楼层
0、比特
1、2的7次方-1
2、8的64次方
3、-3.40282×10的38次方
4、
12
204
120
255
0
5、
1000
11011
1100011
1000
10000010

#include<stdio.h>

int main()
{
          int i;
          unsigned int j;
          i = 255;
          j = 255;
          int c;
        scanf("%d",&c);
        printf("%d\n",c);
          printf("%d\n",i);
          printf("%d\n",j);
          return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2018-4-27 15:44:42 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2018-7-24 00:01:19 | 显示全部楼层
转换字符这么多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2018-11-15 16:36:03 | 显示全部楼层
#X 这里可以直接输入x. 我在Linux下怎么不能执行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2019-3-13 15:06:59 | 显示全部楼层
说实在看不懂哟==
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1

GMT+8, 2020-12-5 11:10

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表