printf-scanf-占位符

printf

  • printf() 的作用是将参数文本输出到屏幕。它名字里面的 f 代表 format (格式化),表示可以 定制输出文本的格式。
  • printf() 不会在行尾自动添加换行符,运行结束后,光标就停留在输出结束的地⽅,不会自动换行。 为了让光标移到下一行的开头,可以在输出的结尾,添加⼀个 \n。
  • printf() 是在标准库的头头件 stdio.h 定义的。使用这个函数之前,必须在源码文件头部引入这 个头文件。

占位符

  • printf() 可以在输出文本中指定占位符。  “占位符”,就是这个位置可以用其他值代入。占位符的第⼀个字符⼀律为百分号 % ,第⼆个字符表⽰占位符的类型。
  • printf() 参数与占位符是⼀⼀对应关系,如果有 n 个占位符, printf() 的参数就应该有 n + 1 个。如果参数个数少于对应的占位符, printf() 可能会输出内存中的任意值。

占位符列举

  • printf() 的占位符有许多种类,与 数据类型相对应。下⾯列出常用的占位符
%c :字符。
%d :十进制整数。// int
%f :小数(包含 float 类型和 double 类型)。//float  %f   double  %lf
%hd :十进制 short int 类型。
%hu :unsigned short int 类型。
%ld :十进制 long int 类型。
%lu :unsigned long int 类型。
%Lf :long double 类型浮点数。
%p :指针(⽤来打印地址)。
%s :字符串。
%u :无符号整数(unsigned int)。
%x :十六进制整数。
%zd size_t 类型。
%% :输出一个百分号。
  • printf() 可以定制占位符的输出格式
  • 限定宽度:限定占位符的最小宽度,达成右对齐(+),左对齐(-)

对于小数,这个限定符会限制所有数字的最小显示宽度。

printf("%5d", 123);// 输出为 " 123"符的输出格式
//%5d 表⽰这个占位符的宽度⾄少为5位。如果不满5位,对应的值的前⾯会添加空格
//输出的值默认是右对⻬,即输出内容前⾯会有空格
//左对⻬,在输出内容后⾯添加空格,可以在占位符的 % 的后⾯插⼊⼀个 - 号
printf("%-5d\n", 123); // 输出为 "123 "
printf("%12f\n", 123.45);
//%12f 表⽰输出的浮点数最少要占据12位。由于⼩数的默认显⽰精度是⼩数点后6位,
//所以 123.45 输出结果的头部会添加2个空格。
  •  总是显示正负号
默认情况下, printf() 不对正数显示  + 号,只对负数显示- 号。如果想让正数也输出 + 号,可
以在占位符的 % 后面加⼀个 +
默认情况下, printf() 不对正数显示  + 号,只对负数显示  - 号。如果想让正数也输出 + 号,可
以在占位符的 % 后面加⼀个 +
printf("%+d\n", 12); // 输出 +12
printf("%+d\n", -12);// 输出 -12
  • 限定小数位数
输出小数时,有时希望限定小数的位数。举例来说,希望小数点后⾯只保留两位,占位符可以写
成 %.2f。如果希望小数点后面输出3位 ,占位符写成 %.3f。
这种写法可以与限定宽度占位符,结合使用。
%6.2f 表示 输出字符串最小宽度为6,小数位数为2。
printf("%6.2f\n", 0.5);//输出字符串的头部有两个空格
最小宽度和小数位数这两个限定值,都可以⽤ * 代替,通过 printf() 的参数传入。
printf("%*.*f\n", 6, 2, 0.5);//等同于
printf("%6.2f\n", 0.5);
  • 输出部分字符串
%s 占位符用来输出字符串,默认是全部输出。
如果只想输出开头的部分,可以⽤ %.[m]s 指定输出 的长度,其中 [m] 代表⼀个数字,表示所要输出的长度。
printf("%.5s\n", "hello world");
//占位符 %.5s 表⽰只输出字符串“hello world”的前5个字符,即“hello”。

scanf

  • scanf() 函数用于读取⽤户的键盘输入。
程序运行到这个语句时,会停下来,等待用户从键盘输入。
⽤户输入数据、按下回车键后, scanf() 就会处理输入,将其存入变量。 它的原型定义在头文件 stdio.h
scanf("%d", &i);
//变量前⾯必须加上 & 运算符(指针变量除外),因为 scanf() 传递的不是值,⽽是地址,
//即将变量 i 的地址指向⽤⼾输⼊的值
  • scanf() 处理数值占位符时,会⾃动过滤空白字符,包括空格、制表符、换行符等。所以,用户输⼊的数据之间,有⼀个或多个空格不影响 scanf() 解读数据。另外,用户使用回车键,将输入分成几行,也不影响解读。
  • scanf() 解读用户输入时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条 件的字符为止。
int x;
float y;
// 输⼊ " -13.45e12# 0"
 scanf("%d", &x);
 printf("%d\n", x);
 scanf("%f", &y);
 printf("%f\n", y);
//等同于
scanf("%d%f", &x, &y);
// scanf() 读取⽤⼾输⼊时, %d 占位符会忽略起⾸的空格,从 - 处开始获取数据,
//读取到 -13 停下来,因为后⾯的 . 不属于整数的有效字符。
//这就是说,占位符 %d 会读到 -13 。
//第⼆次调⽤ scanf() 时,就会从上⼀次停⽌解读的地⽅,继续往下读取。
//这⼀次读取的⾸字符 . ,由于对应的占位符是 %f ,会读取到 .45e12 ,
//这是采⽤科学计数法的浮点数格式。
//后⾯的# 不属于浮点数的有效字符,所以会停在这⾥。
  • scanf() 的返回值是⼀个整数,表示成功读取的变量个数。
    如果没有读取任何项,或者匹配失败,则返回 0
    如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量 EOF (-1)。EOF - end of file 文件结束标志。
  • scanf() 常⽤的占位符如下,与 printf() 的占位符基本⼀致。
      %c :字符。
      %d :整数。
      %f float 类型浮点数。
      %lf double 类型浮点数。
      %Lf long double 类型浮点数。
      %s :字符串。
      %[] :在⽅括号中指定⼀组匹配的字符(比如 %[0-9] ),遇到不在集合之中的字符,匹配将会停止。
  • 除了 %c 以外,都会自动忽略起首的空白字符。 %c 不忽略空白字符,总是返回当前第⼀个字符,无论该字符是否为空格。如果要强制跳过字符前的空白字符,可以写成 scanf(" %c", &ch) ,即 %c 前加上⼀个空格,表示跳过零个或多个空白字符。
  • 占位符 %s ,它其实不能简单地等同于字符串。它的规则是,从当前第⼀个非空白字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)为止。因为 %s 不会包含空白字符,所以无法用来读取多个单词,除非多个 %s ⼀起使⽤。这也意味着, scanf() 不适合读取可能包含空格的字符串,比如书名或歌曲名。另外, scanf() 遇到 %s 占位符,会在字符串变量末尾存储⼀个空字符 \0 使用  %s 占位符时,应该指定 读入字符串的最长长度,即写成 %[m]s ,其中的 [m] 是⼀个整数,表示读取字符串的最大长度,后 面的字符将被丢弃。
  • 赋值忽略符 * ,只要把 * 加在任何占位符的百分号后⾯,该占位符就不会返回值,解析后将被丢弃。
 int year = 0;
 int month = 0;
 int day = 0;
 scanf("%d%*c%d%*c%d", &year, &month, &day);
\\在年月日连接处输入任意一个字符均可以被识别(%c)

ps.局部变量不初始化,他的值是随机的;全局变量不初始化,默认值为0。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JIEGAOBABY

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

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

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

打赏作者

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

抵扣说明:

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

余额充值