1.print1.1基本用法printf()的作用是将参数文本输出到屏幕。它的名字里的f代表format(格式化),表示可以定制输出文本的格式。
比如想让屏幕上输出Hello world!
printf()不会在行尾自动添加换行符,运行结束光标会停留在输出结束的地方,不会自动换行,为了使输出结束后自动换到下一行,可以在输出文本后添加一个换行符]\n.
d4f1f4a1d2f047d59b9fa6b79fb593ff.png下面是加入换行符和不加换行符运行程序后的区别
未加
3f41faafa25c4733a752cc8d9c773061.png后加
a94d8fb68245434bb950d54bac6dbaa6.png如果文本内部有换行,也可通过插入换行符实现。例如
627018a5567b4ee8b8bd70a6ff7d263b.png上面的程序运行之后
ef145244536c4222b0254ebe0b0d94a9.pngprintf()是在标准的头文件stdio.h中定义的。使用这个函数之前,必须在源码文件头部引入这个头文件。(相当于借用别人的东西给人家打招呼)
1.2占位符printf()可以在输出文本中指定占位符。所谓“占位符”,就是这个位置可以用其他值代入。
例如输出There are 3 apples
9f191de27a294527b94806584ea25eb3.png7afdd56050ae40ad9851958fa2f3de6c.png上面示例中,There are %d apples\n是输出文本,里面的%d就是占位符,表示这个位置要用其他的值来替换。占位符的第一个字符一律用%,第二个符号表示占位符的类型,%d表示这里带入的值必须是一个整数。
printf()的第二个参数,("There are %d apples",)后面的参数,就是替换占位符的值,上面的例子中整数3替换了,执行后的输出结果就是There are 3 apples.
常用的占位符还有以下:
f815226165524780bd1f695a2216cbc4.png就拿%s(表示带入的是字符串)再举一例
5d1445219b214a01b996d9b396135750.png%s表示带入的是字符串,所以printf()第二个参数就必须是字符串,就是例子中的Zhangsan。执行后的输出就是Zhangsan is a lawyer
输出文本中也可使用多个占位符。
e477c35c6d9c4ba7b8c38bdee7520590.png输出结果为
ecc0770f59f747738efa4d55f9276a15.png上述中,输出文本%s says it is %d o'clock有两个占位符,第一个是字符串占位符%s,第二个是整数占位符%d,分别对应printf()中的第二个参数(Li Ming)和第三个参数(8),执行后的输出就是Li Ming says it is 8 o'clock。
printf()的占位符与参数是一一对应的,有n个占位符就有n+1个参数。
37c4ae83a8e3425ca5bc4e77a7a9c807.png红色1 2 分别表示的是第一个占位符和第二个占位符
蓝色1 2 3分别表示第一个参数,第二个参数,第三个参数。1.4.1
如果参数个数少于对应的占位符,printf()可能会输出内存中的任意值。
1.3占位符列举printf() 的占位符有许多种类,与 C 语言的数据类型相对应。下面按照字母顺序,列出常用的占位
符,方便查找,具体含义在后面章节介绍。
•%a :十六进制浮点数,字母输出为小写。
•%A :十六进制浮点数,字母输出为大写。
•%c :字符。
•%d :十进制整数。
•%e :使用科学计数法的浮点数,指数部分的 e 为小写。
•%E :使用科学计数法的浮点数,指数部分的 E 为大写。
•%i :整数,基本等同于 %d 。
•%f :小数(包含 float 类型和 double 类型)。
•%g :6个有效数字的浮点数。整数部分一旦超过6位,就会自动转为科学计数法,指数部分的 e
为小写。
•%G :等同于 %g ,唯⼀的区别是指数部分的 E 为大写。
•%hd :十进制 short int 类型。
•%ho :八进制 short int 类型。
•%hx :十六进制 short int 类型。
•%hu :unsigned short int 类型。
•%ld :十进制 long int 类型。
•%lo :八进制 long int 类型。
•%lx :十六进制 long int 类型。
•%lu :unsigned long int 类型。
•%lld :十进制 long long int 类型。
•%llo :八进制 long long int 类型。
•%llx :十六进制 long long int 类型。
•%llu :unsigned long long int 类型。
•%Le :科学计数法表⽰的 long double 类型浮点数。
•%Lf :long double 类型浮点数。
•%n :已输出的字符串数量。该占位符本身不输出,只将值存储在指定变量之中。
•%o :八进制整数。
•%p :指针。
•%s :字符串。
•%u :无符号整数(unsigned int)。
•%x :十六进制整数。
•%zd : size_t 类型。
•%% :输出⼀个百分号
1.4输出格式printf()可以定制占位符的输出格式。
1.4.1限定宽度printf()允许限定占位符的最小宽度。
dcb9915fe64f4dccad8f88d04c9efad3.pngd7b5a1b2858145f880845d79b105b4c6.png上面示例中%5d表示这个占位符的最小宽度为5位。如果不满5位对应的值前面就会添加空格。输出的值默认是右对齐,即输出的内容前面会有空格;当然有右对齐就会有左对齐,左对齐就是在输出内容的后面添加空格。可以在占位符%后面添加一个负号。
26f163fa82824ba6a400c8dbd0838f53.png2d0d5e3db0504936a3c363901cd8ae7a.png上面示例中,在123后面添加了空格,为了能看到空格,我在123的后面加了“哈哈”。
对于小数,这个限制符会限制所有小数的最小显示宽度。
f520c3dbca8f477b887938386b17f73c.png3fd5627487fa4f4e8ecef75e41525b86.png上面示例中,%12f表示输出的浮点数最少要占据12位,由于%f默认小数点后打印6位,所以123.45输出结果的前面会添加2个空格。注意小数点也算一位。
1.4.2总是显示正负号默认情况下,printf()不对正数显示+号,只对负数显示-号,正如我们日常生活中+1写为1而不写+1一样。
6da1512b98a04cd4a7d50af9dcdf2cf4.pngecc000b47a8540ab91d89fdc1dcac959.png如果想让正数也显示+号,可以在占位符%后面加一个+。
aec8bb5fa6f24450b0bc06dbda93a191.pngfe8842de4a6940638761228f58722e0f.png上面示例中,%+d确保输出的数值,总是带有正负号。
1.4.3限定小数位数如果输出小数时,希望小数点后面保留两位,占位符可以写成%.2f
0ea4fb6ffd73437986305c0c07898dea.png7173a48426054ff3b04b3d8a5dfc00d1.png如果希望小数点后面输出3位(0.500),占位符就要写成%.3f。
这种写法遵循四舍五入原则,例如想让0.526小数后保留2位,结果就会显示0.53
当然这种写法还能和限定宽度占位符结合使用。
38348dec8131442f9d087d492ba9e164.pngf8cd67feb076463496d0aadfaa696249.png其中6表示最少打印6位,不够拿空格填入,如果输出文本够6位就不用填入。
最小宽度和小数位数这两个限定值,都可以用*代替,通过printf()的参数传入。
7f870600eaac42d3b03cbe2d3531e298.png"%*,*f\n,6,2"就相当于"%6.2f\n",两个✳号通过printf()的两个参数传入。
1.4.4输出部分字符串%s占位符用来输出字符串,默认全部输出。如果只想输出开头的部分,可以用%.【m】s指定输出的长度,其中【m】代表一个数字,表示所输出的长度。
比如helo world中只想输出hello
1a6c80bb3dc64eed859c1e921467feac.png1aaf6c69a07b43d2b00fa172b26392de.png2.scanfprintf函数为输出,有输出那么就会有输入,输入就是scanf函数.
举个例子:
c74e2c8b79684ac7a3d2a0dbf1635c85.png运行程序
c256eaae297d457a9108d5f11cb733a6.png2.1基本用法scanf()用于读取用户的键盘输入。就是用于添加你想输进去的数据。程序运行到scanf()这个函数值时会停下来等待用户输入。用户输入数据,按下回车键后,scanf()会处理用户的输入数据,将其存为变量。它的原型和printf一样也是定义在头文件stdio.h中。
scanf的语法和printf类似
比如scanf("%d",&i),第一个参数%d,表示用户输入的第一个数为整数,&i表示,将用户从键盘输入的整数存入变量i。
注意:变量前必须加上&运算符(指针变量除外),&是一个取地址符号。因为scanf传递的是地址,而不是具体的值。
如果这些变量都是指针变量(比如字符串变量),就不需要加&。
2.2scanf的返回值scanf()的返回值是一个整数,表示成功读取的变量个数。
如果没有任何项或者匹配失败那么就会返回0。如果成功读取到数据但是数据发生了错误就会返回EOF(-1)。
2.3占位符scanf() 常用的占位符如下,与 printf() 的占位符基本⼀致。
•%c :字符。
•%d :整数。
•%f : float 类型浮点数。
•%lf : double 类型浮点数。
•%Lf :long double 类型浮点数。
•%s :字符串。
•%[] :在方括号中指定⼀组匹配的字符(比如 %[0-9] ),遇到不在集合之中的字符,匹配将会
停止。
上面所有占位符之中,除了 %c 以外,都会自动忽略起首的空白字符(空格)。 %c 不忽略空白字符,总是返回当前第⼀个字符,无论该字符是否为空格。
如果要强制跳过字符前的空白字符,可以写成 scanf(" %c", &ch) ,即 %c 前加上⼀个空格,表
示跳过零个或多个空白字符。
占位符 %s ,它不能简单地等同于字符串。它的规则是,从当前第⼀个非空白
字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)为止。
因为 %s 不会包含空白字符,所以无法用来读取多个单词,除非多个 %s ⼀起使用,比如英文歌名So Far Away。这也意味着,scanf() 不适合读取可能包含空格的字符串。
scanf() 遇到 %s 占位符,会在字符串变量末尾存储⼀个空字符 \0 。
scanf() 将字符串读入字符数组时,不会检测字符串是否超过了数组长度。所以,储存字符串时,
很可能会超过数组的边界,导致预想不到的结果。为了防止这种情况,使用 %s 占位符时,应该指定读入字符串的最长长度,即写成 %[m]s ,其中的 [m] 是⼀个整数,表示读取字符串的最大长度,字符串超出最大长度,后面的字符将被丢弃。
2.4赋值忽略符 有时候,用户的输入可能不符合预定的格式。
7d88e8757543408bae357d69d48d031f.png上面的例子中,2023-11-27,就会正确解读出 年 月 日,如果用户输入的是2023/11/27这种格式,scanf ()解析数据就会失败。
那么为了避免这种情况,我们就可以用赋值忽略符(*)。只要把*加在任何占位符的%后面,该占位符就不会返回值,解析后将被丢弃。
09e0211d4b294712ad9ef86a35317f0e.png输入2023-11-27
52caa05b858f4800a7fcf1e89547127b.png输入2023/11/27
这样可以使格式控制灵活,不至于太死板。