C语言—scanf和printf的介绍

1.print

1.1基本用法

printf()的作用是将参数文本输出到屏幕。它的名字里的f代表format(格式化),表示可以定制输出文本的格式。

比如想让屏幕上输出Hello world!7c670758dd16480e8c6c79f78a7f89ce.pngprintf()不会在行尾自动添加换行符,运行结束光标会停留在输出结束的地方,不会自动换行,为了使输出结束后自动换到下一行,可以在输出文本后添加一个换行符]\n.

d4f1f4a1d2f047d59b9fa6b79fb593ff.png

下面是加入换行符和不加换行符运行程序后的区别

                                                                         未加

3f41faafa25c4733a752cc8d9c773061.png

后加

a94d8fb68245434bb950d54bac6dbaa6.png如果文本内部有换行,也可通过插入换行符实现。例如

627018a5567b4ee8b8bd70a6ff7d263b.png

上面的程序运行之后

ef145244536c4222b0254ebe0b0d94a9.png

printf()是在标准的头文件stdio.h中定义的。使用这个函数之前,必须在源码文件头部引入这个头文件。(相当于借用别人的东西给人家打招呼)

1.2占位符

printf()可以在输出文本中指定占位符。所谓“占位符”,就是这个位置可以用其他值代入。

例如输出There are 3 apples

9f191de27a294527b94806584ea25eb3.png

7afdd56050ae40ad9851958fa2f3de6c.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.png

d7b5a1b2858145f880845d79b105b4c6.png

上面示例中%5d表示这个占位符的最小宽度为5位。如果不满5位对应的值前面就会添加空格。输出的值默认是右对齐,即输出的内容前面会有空格;当然有右对齐就会有左对齐,左对齐就是在输出内容的后面添加空格。可以在占位符%后面添加一个负号。

26f163fa82824ba6a400c8dbd0838f53.png

2d0d5e3db0504936a3c363901cd8ae7a.png

上面示例中,在123后面添加了空格,为了能看到空格,我在123的后面加了“哈哈”。

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

f520c3dbca8f477b887938386b17f73c.png

3fd5627487fa4f4e8ecef75e41525b86.png                                                                                                                                  

上面示例中,%12f表示输出的浮点数最少要占据12位,由于%f默认小数点后打印6位,所以123.45输出结果的前面会添加2个空格。注意小数点也算一位。

1.4.2总是显示正负号

默认情况下,printf()不对正数显示+号,只对负数显示-号,正如我们日常生活中+1写为1而不写+1一样。

6da1512b98a04cd4a7d50af9dcdf2cf4.png

ecc000b47a8540ab91d89fdc1dcac959.png

如果想让正数也显示+号,可以在占位符%后面加一个+

aec8bb5fa6f24450b0bc06dbda93a191.png

fe8842de4a6940638761228f58722e0f.png

上面示例中,%+d确保输出的数值,总是带有正负号。

1.4.3限定小数位数

如果输出小数时,希望小数点后面保留两位,占位符可以写成%.2f

0ea4fb6ffd73437986305c0c07898dea.png

7173a48426054ff3b04b3d8a5dfc00d1.png

如果希望小数点后面输出3位(0.500),占位符就要写成%.3f。 

这种写法遵循四舍五入原则,例如想让0.526小数后保留2位,结果就会显示0.53

当然这种写法还能和限定宽度占位符结合使用。

38348dec8131442f9d087d492ba9e164.png

f8cd67feb076463496d0aadfaa696249.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.png

1aaf6c69a07b43d2b00fa172b26392de.png

2.scanf

printf函数为输出,有输出那么就会有输入,输入就是scanf函数.

举个例子:

c74e2c8b79684ac7a3d2a0dbf1635c85.png

运行程序

c256eaae297d457a9108d5f11cb733a6.png

2.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

f5414ab8c17d48b6ae495f5dd6fbe941.png

这样可以使格式控制灵活,不至于太死板。

  • 31
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值