时隔多日,小编我又返来咯······小编信任之前的博客可以或许给各人带来不少的劳绩。在我们之前的文章中,许多代码块的例子都用到了printf( ) 与 scanf( )这两个函数,各人都知道他们须要声明头文件之后才气使用,那这两个函数是什么呢?这两个函数的用途是什么呢??这两个函数又有什么其他的用法呢???本日小编就围绕这个这两个函数为各人睁开讲讲。
1. printf( )
1.1 printf( )的根本用法
printf( ) 这个函数没有太多抽象的地方,其作用就是将参数文本输入到屏幕上。但是过细想想,感觉那边好像不对劲,英文中的打印应该是 print,但是这个函数为什么要在 print 反面多加一个 f 呢??这里小编给读者们表明一下,这里的 f 代表的是英文中的format,就是格式、格式化的意思,这也阐明确 printf( ) 尚有许多其他的 “玩法”( f 着实代表的是可以定制输出文本格式),小编给各人逐一先容。 - #include <stdio.h>
- int main()
- {
- printf("Hello World");
- return 0;
- }
复制代码 如果我们实行这段代码,这段代码的效果就是将 "Hello World" 这行笔墨打印在屏幕上。在我们没有对 printf( ) 做出任何定制化输出的时间,这个函数是不会在这串笔墨打印完的时间添加换行符的,运行竣事后,光标就会停顿在输出竣事的地方,不会自动换行。如果我们想让光标移动到下一行的开头,可以在输出文本的末端加上一个换行符 '\n' 。想要在文本内部实现换行,我们也可以通过插入换行符来实现:- #include <stdio.h>
- int main(void)
- {
- printf("Hello\nWorld\n");
-
- printf("Hello\n");
- printf("World\n");
- return 0;
- }
复制代码 上述代码实行效果
在第一个 printf( ) 中,要留意两个 '\n' 的位置,出现 '\n' 则换行继承输入。紧张的小细节小编会为各人反复夸大:printf( ) 是在标准库的头文件 stdio.h 界说的。使用这个函数之前,必须要在原码文件的头部引入这个头文件!!!
1.2 占位符
printf( ) 可以在输出的文本中指定占位符,这里大概读者们会有疑惑:什么是占位符呢?所谓的占位符,就是这个地方可以用其他的值代入。接下来看个例子:- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- int main()
- {
- printf("There are %d apples\n", 10);
- return 0;
- }
复制代码 上述代码实行效果
从这段代码中我们可以看到,%d 的位置被我们给定的数值 10 给更换了。There are %d apples\n 是输出的文本,%d 就是占位符,体现 %d 的位置要用其他值来更换,占位符的第一个字符划一为百分号 % ,第二个字符体现占位符的范例,%d 体现这里代入的值必须是⼀个整数。在这个例子中,printf( ) 的第二个参数就是更换占位符的值。
输入的文本中也可以使用多个占位符:- #include <stdio.h>
- int main()
- {
- printf("%s says it is %d o'clock\n", "Lee", 5);
- return 0;
- }
复制代码 上述代码运行效果
输出文本 %s says it is %d o'clock 有两个占位符,第一个是字符串占位符 %s ,第二个是整数占位符 %d ,分别对应 printf( ) 的第二个参数 Lee 和第三个参数 5。实行后的输出就是 Lee says it is 5 o'clock 。还须要提示读者们的是如果参数少于对应的占位符,printf( ) 大概会输入内存中的恣意值。
1.3 占位符的罗列
printf() 的占位符有许多种类,与 C 语言的数据范例相对应。下面按照字母次序,列出常用的占位符供读者参考:
%a :十六进制浮点数,字母输出为小写。
%A :十六进制浮点数,字母输出为大写。
%c :字符。
%d :十进制整数。// int
%e :使用科学计数法的浮点数,指数部分的 e 为小写。
%E :使用科学计数法的浮点数,指数部分的 E 为大写。
%i :整数,根本等同于 %d 。
%f :⼩数(包罗 float 范例和 double 范例)。//float - %f double - %lf
%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( ) 可以定制占位符的输特殊式,起首答应限定占位符的最小宽度:- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- int main()
- {
- printf("%7d\n", 1234);
- return 0;
- }
复制代码 上述代码运行效果
%5d 体现这个占位符的宽度至少为 5 位。如果不满 5 位,对应的值的前面会添加空格。输出的值默认是右对齐,即输出内容前面会有空格;如果盼望改成左对齐,在输出内容反面添加空格,可以在占位符的 % 的反面插入一个 - 号:
右对齐用例
由于是右对齐,1234 反面不敷 7 位的部分会用空格补齐,固然看不出来,但是我们要知道 1234 反面尚有三个空格。
对于小数这个限定符会限定全部数字的最小体现宽度:
通过代码的实行效果我们可以看到,%12f 体现输出的浮点数最少要占据 12 位。由于小数的默认体现精度是小数点后 6 位,以是 123.45 输出效果的头部会添加 2 个空格。
默认环境下, printf( ) 不对正数体现 + 号,只对负数体现 - 号。如果想让正数也输出 + 号,可 以在占位符的 % 后,面加⼀个 + :- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- int main()
- {
- printf("%+d\n", 12); // 输出 +12
- printf("%+d\n", -12); // 输出 -12
- return 0;
- }
复制代码 上述代码运行效果
%+d 可以确保输出的数值,总是带有正负号。
我们还可以通过占位符限定输出的小数位,举例来说,我们如果盼望输出的浮点数只生存小数点后两位,那我们就可以将占位符写成%.2f :- #include <stdio.h>
- int main()
- {
- printf("Number is %.2f\n", 0.5);
- return 0;
- }
复制代码 上述代码运行效果
更一样平常的有:想要生存 A 位的小数位,占位符就写成 %.Af ,如果是双精度浮点型的话,就须要写成 %.Alf。而且这种写法可以团结限定宽度的占位符使用:
团结限定宽度用例
%7.2f 体现输出字符串最小宽度为 7 ,小数位数为 2 。以是,输出字符串的头部有 3 个空格。
最小宽度和小数位这两个限定值都可以用 * 取代,可以通过 printf( ) 导入:
限定值可用 * 取代用例
连续了使用 %7.2f 的用例,通过观察效果可以发现,直接用数字限定宽度和小数位与用 * 取代再通过 printf( ) 导入的实行效果是一样的(将 7 和 2 用 * 取代,再使用 printf( ) 导入)。
%s 占位符用来输出字符串,默认是全部输出。如果只想输出开头的部分,可以用 %.[m]s 定输出的长度,此中 [m] 代表⼀个数字,体现所要输出的长度:
我们可以发现,占位符 %.5s 体现只输出字符串 “hello 1234” 的前5个字符,即“hello”。
2. scanf( )
2.1 关于 scanf( ) 的使用留意事项
当我们创建了变量之后,我们须要给变量输入一个值就可以使用 scanf() 函数,有一个紧张的事项,使用 VS2022 这款编译器的读者要留意的是:
我们可以查抄一下,这段代码按照常理来说是没有任何语法错误的,但是这段代码却无法运行,编译器的错误列标给出了错因:" 'scanf': This function or variable may be unsafe.Consider using scanf_s instead.To disable deprecation, use _CRT_SECURE_NO_WARNINGS.See online help for details. " 这句话的中文意思是:“ scanf':此函数或变量大概不安全。思量使用scanf_s。要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS。详细信息请拜见联机资助。”
也就是说,编译器限定了我们对 scanf( ) 这个函数的使用,让我们使用 scanf_s ( )。但是小编发起各人不要使用 scanf_s ( ) ,由于这个函数只有在 VS2022 下才气使用,如果使用的不是这个编译器则无法使用,为相识决这个题目,我们可以宏界说 _CRT_SECURE_NO_WARNINGS。
上述用例的实行过程
加上了这个宏界说后,我们就可以正常运行代码了,小编发起使用 VS2022 的小同伴在创建一个项目标时间先写上这个宏界说,这也是一个精良的风俗。
2.2 scanf( ) 的根本用法
scanf( ) 函数用于读取用户的键盘输入。步调运行到这个语句时,会停下来,等待用户从键盘输入。用户输入数据、按下回车键后,scanf( ) 就会处置惩罚用户的输入,将其存入变量。它的原型界说在头文件 stdio.h ,而且 scanf( ) 的语法跟 printf( ) 类似。 scanf( ) 的第⼀个参数是一个格式字符串,内里会放置占位符(与 printf( ) 的占位符根本⼀致),告诉编译器怎样解读用户的输入,须要提取的数据是什么范例。这是由于C语言的数据都是有范例的,scanf( ) 必须提前知道用户输入的数据范例,才气处置惩罚数据。
scanf( ) 的别的参数就是存放用户输入的变量,格式字符串内里有多少个占位符,就有多少个变量。上面示例中, scanf( ) 的第⼀个参数 %d ,体现用户输入的应该是一个整数。%d 就是一个位符, % 是占位符的标记,d 体现整数。第二个参数 &i 体现,将用户从键盘输入的整数存入变量 i 。留意:变量前面必须加上 & 运算符(指针变量除外),由于 scanf( ) 通报的不是值,而是地点,即:将变量 i 的地点指向用户输入的值。如果这里的变量是指针变量(比如字符串变量),那就不消加 & 运算符。 scanf( ) 也可以一次性读取多个变量:- scanf("%d%d%f%f", &i, &j, &x, &y);
复制代码 且在处置惩罚数值占位符时,会自动过滤空缺字符,包罗空格、制表符、换行符等。以是,我们在输入的数据之间有一个大概是多个空格不会影响 scanf( ) 解读数据;使用回车换几行,将数据分行输入也不会影响这个函数解读数据。
scanf() 处置惩罚用户输入的原理是,用户的输⼊先放入缓存,比及按下回车键后,按照占位符对缓存举行解读。解读用户输入时,会从上一次解读遗留的第一个字符开始,直到读完缓存,大概遇到第⼀个不符合条件的字符为止:
上⾯⽰例中,scanf( ) 读取用户输入时, %d 占位符会忽略数据首部的空格,从 1 处开始获取数据,读取到 123 停下来,由于反面的 . 不属于整数的有效字符。这就是说,占位符 %d 会读到 123。
第二次调用 scanf( ) 时,就会从上一次克制解读的地方,继承往下读取。这一次读取的首字符 是 . ,由于对应的占位符是 %f ,会读取到 .12345 ,这是采取科学计数法的浮点数格式。反面的 * 不属于浮点数的有效字符,以是会停在 * 这里。
2.3 scanf( ) 的返回值
我们在使用这个函数的时间可以发现,在错误列标这里有两个告诫:“scanf 的返回值被忽略” ,也就是说,scanf( ) 这个函数是有返回值的。
这里小编就来给各人解说一下,scanf( ) 的返回值是一个整数,体现的是乐成读取的变量个数。对于没有读取到任何一个项,大概是匹配失败,scanf( ) 的返回值都是 0;如果在乐成读取任何数据之前,发生了读取错误大概遇到读取到文件末端,则返回常量 EOF (-1)------EOF的全称是end of file,它也是文件竣事的标记。我们可以用一组代码来测试一下:- #include <stdio.h>
- 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);
- return 0;
- }
复制代码
根据效果可以发现:我们输入的三个数据都被乐成读取到了,我们将 scanf( ) 的数值赋给了一个变量 r ,再将这个 r 打印,r 的返回值是 3 ,也就阐明确 3 个数据被乐成读取到了。但是,如果我们使用两下快捷键 “ 啃臭+z ” 将提前竣事输入,那效果是什么呢??
可以发现,如果我们提前竣事了输入,scanf( ) 只乐成读取了两个变量,以是返回值就是 2,如果一个数字都不输入,直接按 3 次 “ 啃臭+z ” , 输出的 r 是 -1,也就是EOF:
2.4 占位符
scanf() 常用的占位符如下,与 printf() 的占位符根本同等:
%c :字符。%d :整数。%f : float 范例浮点数。%lf : double 范例浮点数。%Lf : long double 范例浮点数。%s :字符串。%[ ] :在方括号中指定一组匹配的字符(比如 %[a-h] ),遇到不在聚集之中的字符,匹配将会克制。 以上全部占位符之中,除了 %c 以外,都会自动忽略起首的空缺字符。%c 不忽略空缺字符,总是返回当前第⼀个字符,无论该字符是否为空格。如果要欺压跳过字符前的空缺字符,可以写成 scanf(" %c", &ch) ,即 %c 前加上⼀个空格,体现跳过零个或多个空缺字符。 留意:特殊说⼀下占位符 %s ,它着实不能简单地等同于字符串。它的规则是,从当前第⼀个非空缺字符开始读起,直到遇到空缺字符(即空格、换行符、制表符等)为止。由于 %s 不会包罗空缺字符,以是无法用来读取多个单词,除非多个 %s 一起使用。这也意味着,scanf( ) 不恰当读取大概包罗空格的字符串,比如书名或歌曲名。别的, scanf( ) 遇到 %s 占位符,会在字符串变量末了存储⼀个空字符\0 。
scanf( ) 将字符串读入字符数组时,不会检测字符串是否高出了数组长度。以是,储存字符串时,很大概会高出数组的边界,导致预想不到的效果。为了防止这种环境,使用 %s 占位符时,应指定读入字符串的最大长度,即写成 %[m]s ,此中的 [m] 是⼀个整数,意为读取字符串的最大长度,而最大长度后的字符将被扬弃:
限定字符串输入长度的用法
2.5 赋值忽略符
有的时间,用户的输入大概不符合我们预期的格式:- #include <stdio.h>
- int main()
- {
- int year = 0;
- int month = 0;
- int day = 0;
- scanf("%d-%d-%d", &year, &month, &day);
- printf("%d %d %d\n", year, month, day);
- return 0;
- }
复制代码 代码如上,如果用户输入 2020-01-01 ,就会精确解读出年、月、日。题目是用户大概输入其他格式比如 2020/01/01 ,这种环境下, scanf( ) 剖析数据就会失败。
为了防止这种环境的发生,我们须要引入一个复制忽略符 * 。只要把 *加在任何占位符的百分号反面,该占位符就不会返回值,剖析后将被扬弃。- scanf("%d%*c%d%*c%d", &year, &month, &day);
复制代码 这里小编来给各人表明一下: %*c 就是在占位符的百分号反面加上了赋值忽略符 * ,体现这个占位符没有对应的变量,解读后不必返回。
3. 结语
到这里小编就将 printf( ) 与 scanf( ) 这两个我们最常见的函数剖析完了,盼望各人可以或许从中有所劳绩,内容有点多,还须要各位读者渐渐去意会和明白,“ 有道无术,术可求;有术无道,止于术 。”我们学习不能只能停顿在外貌,还须要去穷究此中的门道,搞清晰原理,这块知识点天然就烙印在脑海中了。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金 |