【C语言】printf、scanf
上期回顾 【C语言】分支与循环—rand、srand、time其他篇章 【C语言专栏】其他专栏 【Linux专栏】文章目录一、printf1、printf的基本用法2、占位符3、常用占位符列举4、限定宽度5、输出部分字符串6、限定小数位数7、显示正负号二、scanf1、scanf的基本用法2、scanf的返回值3、占位符4、赋值忽略符一、printf1、printf的基本用法将参数文本输出到屏幕上但需注意的是不会在行尾自动添加换行符运⾏结束后光标就停留在输出结束的地⽅不会自动换行。为了让光标移到下⼀⾏的开头可以在输出⽂本的结尾添加⼀个换⾏符 “\n” 。#includestdio.hintmain(void){printf(Hello World\n);return0;}运行结果注printf() 是在标准库的头⽂件 “stdio.h”定义的。使⽤这个函数之前必须在源码⽂件头部引⼊这个头⽂件。2、占位符2. 1 所谓 “占位符”就是这个位置可以⽤其他值代⼊printf() 可以在输出⽂本中指定占位符。如#includestdio.hintmain(){printf(There are %d apples\n,3);//这里的%d就是占位符return0;}运行结果注意占位符的第⼀个字符⼀律为百分号 % 第⼆个字符表⽰占位符的类型 %d 表⽰这⾥代⼊的值必须是⼀个整数。printf() 的第⼆个参数就是替换占位符的值上⾯的例⼦是整数 3 替换 %d 。执⾏后的输出结果就是 There are 3 apples 。2.2 此外类似的还有%s它表示代入的是一个字符串#includestdio.hintmain(){printf(%s will come tonight\n,Qianyv);return0;}运行结果%s 表⽰代⼊的是⼀个字符串所以 printf() 的第⼆个参数就必须是字符串这里我写了“ Qianyv”执⾏后的输出就是 “Qianyv will come tonight ”。2.3 输出文本里面还可以使用多个占位符如#includestdio.hintmain(){printf(%s says it is %d oclock\n,Qianyv,21);return0;}运行结果输出⽂本%s says it is %d o’clock有两个占位符– 第⼀个是字符串占位符%s 对应第⼆个参数Qianyv– 第⼆个是整数占位符%d对应第三个参数21。执⾏后的输出就是 :lisi says it is 21 o’clock3、常用占位符列举%c字符%d十进制整数int%f 小数float-%f、doule-%lf%x ⼗六进制整数%s 字符串%o ⼋进制整数%p 指针⽤来打印地址%Lf long double 类型浮点数%u ⽆符号整数unsigned int4、限定宽度4.1 printf() 允许限定占位符的最⼩宽度。#includestdio.hintmain(){printf(%5d\n,123);// 输出为 123return0;}%5d 表⽰这个占位符的宽度⾄少为5位。如果不满5位对应的值的前⾯会添加空格。输出的值默认是右对⻬即输出内容前⾯会有空格4.2 如果希望改成“左对齐”在输出内容后面添加“空格”可以在占位符的 % 的后⾯插⼊⼀个 - 号。#includestdio.hintmain(){printf(%-5d\n,123);// 输出为 123 return0;}运行结果4.3 对于⼩数这个限定符会限制所有数字的最⼩显⽰宽度。#includestdio.hintmain(){printf(%12f\n,123.45);return0;}// 输出 123.450000%12f 表⽰输出的浮点数最少要占据12位。由于⼩数的默认显⽰精度是⼩数点后6位所以 123.45 输出结果的头部会添加2个空格。5、输出部分字符串%s 占位符⽤来输出字符串默认是全部输出。如果只想输出开头的部分可以⽤ %.[m]s 指定输出的⻓度其中 [m] 代表⼀个数字表⽰所要输出的⻓度。#includestdio.hintmain(){printf(%.5s\n,hello world);return0;}// 输出 hello上⾯⽰例中占位符 %.5s 表⽰只输出字符串“hello world”的前5个字符即“hello”。6、限定小数位数6.1 输出⼩数时有时希望限定⼩数的位数。举例来说希望⼩数点后⾯只保留两位占位符可以写成 %.2f 。#includestdio.hintmain(){printf(Number is %.2f\n,0.5);return0;}// 输出 Number is 0.50上⾯⽰例中如果希望⼩数点后⾯输出3位 0.500 占位符就要写成 %.3f 。6.2 此外限定小数位数可以与限定宽度占位符结合使用#includestdio.hintmain(){printf(%6.2f\n,0.5);return0;}// 输出为 0.50上⾯⽰例中 %6.2f 表⽰输出字符串最⼩宽度为6⼩数位数为2。所以输出字符串的头部有两个空格。6.3 最⼩宽度和⼩数位数这两个限定值都可以⽤ * 代替通过 printf() 的参数传⼊。#includestdio.hintmain(){printf(%*.*f\n,6,2,0.5);return0;}// 等同于printf(%6.2f\n, 0.5);上⾯⽰例中 %*.*f 的两个星号通过 printf() 的两个参数 6 和 2 代⼊。7、显示正负号默认情况下 printf() 不对正数显⽰ 号只对负数显⽰ - 号。如果想让正数也输出 号可以在占位符的 % 后⾯加⼀个 。#includestdio.hintmain(){printf(%d\n,12);// 输出 12printf(%d\n,-12);// 输出 -12return0;}二、scanf当我们有了变量我们需要给变量输⼊值就可以使⽤ scanf 函数如果需要将变量的值输出在屏幕上的时候可以使⽤ printf 函数如:#includestdio.hintmain(){intscore0;printf(请输⼊成绩:);scanf(%d,score);printf(成绩是%d\n,score);return0;}画图演示1、scanf的基本用法1.1 scanf() 函数⽤于读取⽤⼾的键盘输⼊。程序运⾏到这个语句时会停下来等待⽤⼾从键盘输⼊。⽤⼾输⼊数据、按下回⻋键后 scanf() 就会处理⽤⼾的输⼊将其存⼊变量。它的原型定义在头⽂件stdio.h 。scanf(%d,i);它的第⼀个参数是⼀个格式字符串⾥⾯会放置占位符与 printf()的占位符基本⼀致告诉编译器如何解读⽤⼾的输⼊需要提取的数据是什么类型。它的其余参数就是存放⽤⼾输⼊的变量格式字符串⾥⾯有多少个占位符就有多少个变量。上⾯⽰例中 scanf() 的第⼀个参数 %d 表⽰⽤⼾输⼊的应该是⼀个整数。%d 就是⼀个占位符% 是占位符的标志 d 表⽰整数第⼆个参数 i 表⽰将⽤⼾从键盘输⼊的整数存⼊变量i 。注意变量前⾯必须加上 运算符指针变量除外因为 scanf() 传递的不是值⽽是地址即将变量 i 的地址指向⽤⼾输⼊的值。如果这⾥的变量是指针变量⽐如字符串变量那就不⽤加 运算符。1.2 下面是一次将键盘输入读入多个变量的例子scanf(%d%d%f%f,i,j,x,y);上⾯⽰例中格式字符串 %d%d%f%f 表⽰⽤⼾输⼊的前两个是整数后两个是浮点数⽐如 1 -20 3.4 -4.0e3。这四个值依次放⼊ i 、 j 、 x 、 y 四个变量。scanf()处理数值占位符时会⾃动过滤空⽩字符包括空格、制表符、换⾏符等。-1.3 所以⽤⼾输⼊的数据之间有⼀个或多个空格不影响 scanf() 解读数据。另外⽤⼾使⽤回⻋键将输⼊分成⼏⾏也不影响解读。1-203.4-4.0e3上⾯⽰例中⽤⼾分成四⾏输⼊得到的结果与⼀⾏输⼊是完全⼀样的。每次按下回⻋键以后scanf() 就会开始解读如果第⼀⾏匹配第⼀个占位符那么下次按下回⻋键时就会从第⼆个占位符开始解读。1.4 scanf() 处理⽤⼾输⼊的原理是⽤⼾的输⼊先放⼊缓存等到按下回⻋键后按照占位符对缓存进⾏解读。#includestdio.hintmain(){intx;floaty;// ⽤⼾输⼊ -13.45e12# 0scanf(%d,x);printf(%d\n,x);scanf(%f,y);printf(%f\n,y);return0;}上⾯⽰例中 scanf() 读取⽤⼾输⼊时 %d 占位符会忽略起⾸的空格从 - 处开始获取数据读取到 -13 停下来因为后⾯的 . 不属于整数的有效字符。这就是说占位符 %d 会读到 -13 。第⼆次调⽤ scanf() 时就会从上⼀次停⽌解读的地⽅继续往下读取。这⼀次读取的⾸字符是 ’ .’ 由于对应的占位符是 %f 会读取到 .45e12 这是采⽤科学计数法的浮点数格式。后⾯的‘‘#’’不属于浮点数的有效字符所以会停在这⾥。1.4 由于 scanf() 可以连续处理多个占位符所以上⾯的例⼦也可以写成下⾯这样。#includestdio.hintmain()intx;floaty;// ⽤⼾输⼊ -13.45e12# 0scanf(%d%f,x,y);return0;}2、scanf的返回值2.1 scanf() 的返回值是⼀个整数表⽰成功读取的变量个数。如果没有读取任何项或者匹配失败则返回 0 。如果在成功读取任何数据之前发⽣了读取错误或者遇到读取到⽂件结尾则返回常量 EOF (-1)。EOF - end of file ⽂件结束标志#includestdio.hintmain(){inta0;intb0;floatf0.0f;intrscanf(%d %d %f,a,b,f);printf(a%d b%d f%f\n,a,b,f);printf(r %d\n,r);return0;}运行的结果2.2 如果输入2个数后(r 的值为2)按3次 ctrlz就会提前结束输入2.3 如果一个字都不输入直接按3次ctrlz则r的输出为-1即EOF:3、占位符%c 字符。%d 整数。%f float 类型浮点数。%lf double 类型浮点数。%Lf long double 类型浮点数。%s 字符串。%[] 在⽅括号中指定⼀组匹配的字符⽐如 %[0-9]遇到不在集合之中的字符匹配将会 停⽌。1上⾯所有占位符之中除了 %c 以外都会⾃动忽略起⾸的空⽩字符。 %c 不忽略空⽩字符总是返回当前第⼀个字符⽆论该字符是否为空格。2如果要强制跳过字符前的空⽩字符可以写成scanf( %c, ch) 即 %c 前加上⼀个空格表⽰跳过零个或多个空⽩字符。3特别说一下占位符 %s它其实不能简单地等同于字符串。它的规则是从当前第⼀个⾮空⽩字符开始读起直到遇到空⽩字符即空格、换⾏符、制表符等为⽌。4因为 %s 不会包含空⽩字符所以⽆法⽤来读取多个单词除⾮多个 %s ⼀起使⽤。这也意味着scanf() 不适合读取可能包含空格的字符串⽐如书名或歌曲名。另外 scanf() 遇到 %s 占位符会在字符串变量末尾存储⼀个空字符 \0 。5scanf() 将字符串读⼊字符数组时不会检测字符串是否超过了数组⻓度。所以储存字符串时很可能会超过数组的边界导致预想不到的结果。为了防⽌这种情况使⽤ %s 占位符时应该指定读⼊字符串的最⻓⻓度即写成 %[m]s 其中的 [m] 是⼀个整数表⽰读取字符串的最⼤⻓度后⾯的字符将被丢弃。#includestdio.hintmain(){charname[11];scanf(%10s,name);return0;}上⾯⽰例中 name 是⼀个⻓度为11的字符数组 scanf() 的占位符 %10s 表⽰最多读取⽤⼾输⼊的10个字符后⾯的字符将被丢弃这样就不会有数组溢出的⻛险了。4、赋值忽略符4.1 有的用户输入的是不符合预定的格式如果⽤⼾输⼊ 2020-01-01 就会正确解读出年、⽉、⽇。问题是⽤⼾可能输⼊其他格式⽐如 2020/01/01 这种情况下 scanf() 解析数据就会失败。#includestdio.hintmain(){intyear0;intmonth0;intday0;scanf(%d-%d-%d,year,month,day);printf(%d %d %d\n,year,month,day);return0;}运行结果4.2 为了避免这种情况 scanf() 提供了⼀个赋值忽略符assignment suppression character * 。只要把 * 加在任何占位符的百分号后⾯该占位符就不会返回值解析后将被丢弃。#includestdio.hintmain(){intyear0;intmonth0;intday0;scanf(%d%*c%d%*c%d,year,month,day);return0;}运行结果上⾯⽰例中 %*c 就是在占位符的百分号后⾯加⼊了赋值忽略符 *表⽰这个占位符没有对应的变量解读后不必返回。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2548637.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!