C语言printf和scanf函数的详解

printf输出函数

#1.概念
printf—print format 意思就是按照指定的格式打印数据。
打印完后光标会留在打印结束的位置,不会自动换行。
由于是输出函数所以要对头文件include<stdio.h>进行引用。
#2.printf函数中的占位符
printf函数可以在文本中指定输出占位符
例如:

#include <stdio.h>
int main()
{
 printf("There are %d apples\n", 3);
 return 0;
}

**(i)定义:**在"There are %d apples\n"中的%d就叫做占位符。占位符的第⼀个字符⼀律为百分号 % ,第⼆个字符表⽰占位符的类型, %d 表⽰这⾥代⼊的值必须是⼀个整数。
由于c语言中数据类型有很多,因此占位符也有多种。(所列举的为常用)
%c :字符
• %s :字符串
• %f :⼩数(包含 float 类型和 double 类型)
• %d :⼗进制整数。
• %p :指针(16进制)
• %u :⽆符号整数(unsigned int)
• %zd : size_t 类型。
(ii)占位符的使用注意
在面对多个输出值,需要多个占位符时,占位符类型应与数据类型一一对应,且顺序也需一一对应。例如:

#include <stdio.h>
int main()
{
 printf("%s says he is %d", "lisi", 21);
 return 0;
}

1.在这里%s所需类型为字符串,故后面对应的便是"lisi",%d需要整型,后面便对应21。
2.由于%s在$%d前面,故"lisi",也在21前面。
(iii)占位符的中的各类限定
对于宽度的限制,即数据的单位长度。
用法:%m+数据类型(s\c\d等等)如%md就表示该整型占位符的宽度至少m位。不够的空间用空格补齐。

#include <stdio.h>
int main()
{
 printf("%5d\n", 123); // 输出为 "  123",前面有两个空格
 //当m为正数时为右对齐
  printf("%-5d\n", 123); // 输出为 "123  ",前面有两个空格
 //当m为负数时为左对齐
 return 0;
}

其中浮点型的注意点,小数点也算是一位,由于小数点默认显⽰精度是⼩数点后6位,小数点后面补满了后,会在前面补上空格,所以对于%12f打印的结果如下:

#include <stdio.h>
int main()
{
 printf("%12f\n", 123.45);
 // 输出 "  123.450000",前面有两个空格
 return 0;
}

对于符号的显示问题
默认情况下, printf() 不对正数显⽰ + 号,只对负数显⽰ - 号。如果想让正数也输出 + 号,可以在占位符的 % 后⾯加⼀个 + 。如下:

#include <stdio.h>
int main()
{
 printf("%+d\n", 15); // 输出 +15
 printf("%+d\n", -15); // 输出 -15
 return 0;
}

对于小数点后面位数的限制
用法:%.mf,表示保留小数点后面的m位

#include <stdio.h>
int main()
{
 printf("Number is %.2f\n", 0.5);
 // 输出 Number is 0.50
 return 0;
}

可将最⼩宽度和⼩数位数这两个限定值结合如下

#include <stdio.h>
int main()
{
 printf("%6.2f\n", 0.5);//表⽰输出字符串最⼩宽度为6,⼩数位数为2
 printf("%*.*f\n", 6, 2, 0.5);
 //最⼩宽度和⼩数位数这两个限定值,都可以⽤ * 代替,通过 printf() 的参数传⼊。该法个人觉得有点麻烦
 return 0;
}

对于%s占位符的其他用法:输出部分字符串
用法:%.ms,表示输出字符串的前m个字符

#include <stdio.h>
int main()
{
 printf("%.5s\n", "hello world");// 输出 hello
 return 0;
}

scanf输入函数

#1.基本用法
scanf() 函数⽤于读取用户的键盘输⼊。
程序运⾏到这个语句时,会停下来,等待⽤⼾从键盘输⼊。
用户输⼊数据、按下回⻋键后, scanf() 就会处理用户的输⼊,将其存⼊变量。
当然该函数在用时也应该引用头文件include<stdio.h>。
格式:scanf(“想打印的内容+占位符的插入”,&某个变量)
如下:

scanf("%d%d%f%f", &i, &j, &x, &y);
//表⽰⽤⼾输⼊的前两个是整数,后两个是浮点数,⽐如 1 -20 3.4 4.5 。这四个值依次放⼊ i 、 j 、 x 、 y 四个变量。
//&是取地址的意思,将输入的值放入某个变量之中

2.函数的自身特点
(i)对数据的读取:同样的scanf函数中也存在着占位符,用法与printf类似。
scanf() 处理数值占位符时,会⾃动过滤空⽩字符,包括空格、制表符、换⾏符等。所以,用户输⼊的数据之间,有⼀个或多个空格不影响 scanf() 解读数据。
另外,用户使⽤回车键,将输⼊分成几行,也不影响解读。
scanf()解读用户输⼊时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条件的字符为⽌。
例如:

#include <stdio.h>
int main()
{
 int x;
 float y;
 // ⽤⼾输⼊ "  -9.75e12# 0"
 scanf("%d", &x);//x=9
 scanf("%f", &y);//y=0.75*10^12
 return 0;
}

scanf() 读取输⼊时, %d 占位符会忽略起⾸的空格,从 - 处开始获取数据,读取到 -9 停下来,因为后⾯的 . 不属于整数的有效字符。这就是说,占位符 %d 会读到 -9 。第⼆次调⽤ scanf() 时,就会从上⼀次停⽌解读的地⽅,继续往下读取。这⼀次读取的⾸字符是 . ,由于对应的占位符是 %f ,会读取到 .75e12 ,这是采⽤科学计数法的浮点数格式。后⾯的# 不属于浮点数的有效字符,所以会停在这⾥。
(ii)scanf函数的返回值:是⼀个整数,表⽰成功读取的变量个数。如果没有读取任何项,或者匹配失败,则返回 0 。如果在成功读取任何数据之前,发⽣了读取错误或者遇到读取到⽂件结尾,则返回常量 EOF。

int main()
{
 int a = 0;
 int b = 0;
 float f = 0.0f;
 int r = scanf("%d %d %f", &a, &b, &f);
 printf("a=%d b=%d f=%f\n", a, b, f);
 printf("r = %d\n", r);//r=3
 return 0;
}

#3.占位符之间使用的区别
(i)除了 %c 以外,都会⾃动忽略起⾸的空⽩字符。%c 不忽略空⽩字符,总是返回当前第⼀个字符,⽆论该字符是否为空格。
如果要强制跳过字符前的空⽩字符,可以写成 scanf(" %c", &ch) ,即 %c 前加上⼀个空格。除⾮多个 %s ⼀起使⽤。
(ii)对于占位符%s是从当前第⼀个⾮空⽩字符开始读起,直到遇到空⽩字符(即空格、换⾏符、制表符等)为⽌。因此%s 不会包含空⽩字符,⽆法⽤来读取多个单词。
另外, scanf() 遇到 %s 占位符,会在字符串变量末尾存储⼀个空字符 \0 。
#4可能会出现错误的地方
由于scanf() 将字符串读⼊字符数组时,不会检测字符串是否超过了数组⻓度,所以,储存字符串时,很可能会超过数组的边界,导致预想不到的结果。
由于由此错误,便出现了一个 %[m]s(其中的 [m] 是⼀个整数),用来表⽰读取字符串的最大长度,后⾯的字符将被丢弃。
#5.赋值忽略符(个人目前觉得没啥用的东西)

#include <stdio.h>
int main()
{
 int year = 0;
 int month = 0;
 int day = 0;
 scanf("%d-%d-%d", &year, &month, &day);
 return 0;
}

上面示例中,如果用户输⼊ 2020-01-01 ,就会正确解读出年、月、日。问题是用户可能输⼊其他格式,比如 2020/01/01 ,这种情况下, scanf() 解析数据就会失败。为了避免这种情况, scanf() 提供了⼀个赋值忽略符
只要把 * 加在任何占位符的百分号后⾯,该占位符就不会返回值,解析后将被丢弃。

#include <stdio.h>
int main()
{
 int year = 0;
 int month = 0;
 int day = 0;
 scanf("%d%*c%d%*c%d", &year, &month, &day);
 return 0;
}

以上就是全部内容,本人小白一位,如有部分内容不妥当,恳请大佬指正。(DAY 3)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值