今天来对scanf与printf做一个补充讲解,因为这两个函数在C语言中还是非常重要的。
(本文有点长,请耐心食用...)
1.printf
printf从学C语言一开始就在接触了,从"Hello World"就开始了,相信大家早已不陌生。
但我还是来细细讲一下相关内容。
printf( )的作用是将参数文本输出在屏幕上,它的名字里的f代表format(格式化),表示可以定制输出文本的格式。
就拿最基本的Hello World来说
需要如下代码:
#include <stdio.h>
int main()
{
printf("Hello World");
return 0;
}
printf( )不会在行尾自动换行,运行结束以后就会停在Hello World后面而非下一行。
如果想换行的话,需要在Hello World后加上转义字符\n
当然,如果想让Hello World在两行上,也就是文本内部的换行,直接将换行符插入文本内部即可
比如 :Hello\nWorld\n,看着有点别扭。。
也可以这么写:
printf("Hello\n")
printf("World\n")
看起来舒服一点,其实这两种方式写出来的都是一样的结果。
还有一点要注意的是,printf作为库函数,直接使用是会报错的。需要调用包含这个库函数的头文件才可以正常使用。
这也是为什么代码开头要写上#include <stdio.h>
这个stdio.h就是printf的头文件。
有了这个以后才能正常使用printf
还有包括如何调节运行结果过快而显示不清的办法,具体操作详见我的文章:https://blog.csdn.net/2401_85895002/article/details/139907853?spm=1001.2014.3001.5501
另外,printf( )在文本输出中可以指定占位符
占位符,就是指这个位置可以用其他值代入。
C语言中常用占位符有:
%d------整型 %f------浮点数 %lf------高精度浮点数(比较特殊)
%s------字符串 %c------字符 %p------指针
%e------科学计数法 %g------小数或科学计数法
更多占位符放在后面讲。
比如这个例子:
#include <stdio.h>
int main()
{
printf("There are %d apples\n",3);
return 0;
}
输出的结果是There are 3 apples,这里的%d被3取代了,这就是占位符的用法。
但是对应的占位符只能对应相应类型的字符or数字等
占位符最大的特点就是占位符的第一个符号为%
输出的文本里可以使用多个占位符。
如果有n个占位符,那么printf()的参数就有n+1个,如果参数少于对应的占位符,printf()可能会输出内存中的任意值。
占位符合集:
• %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 类型。
• %% :输出一个百分号。
printf( )可以定制占位符的输出格式。
printf( )允许限定占位符的最小宽度。
比如这个例子:
#include <stdio.h>
int main()
{
printf("%5d\n",123);
return 0;
}
其中%5d表示这个占位符的宽度至少为5位。
如果不满5位,对应的值的前面会添加空格。
输出的值默认是右对齐,即输出内容前面会有空格;如果希望改成左对齐,在输出内容后面添加空 格,可以在占位符的 % 的后面插入一个"-"号。
所以这个例子输出的结果是" 123"
如果改为%-5d,输出的结果是"123 "
对于小数(默认显示精度为小数点后六位),这个限定符会限制所有数字的最小显示宽度。
在默认情况下, printf( )不对正数显示 + 号,只对负数显示 - 号。如果想让正数也输出 + 号,可以在占位符的 % 后面加一个 + 。
printf()限定小数位数,输出小数时,有时希望限定小数的位数。举例来说,希望小数点后面只保留两位,占位符可以写成%.2f
也可以与限制宽度占位符结合使用。
比如写作%6.2f,就是表示字符串最小宽度为6,小数位数为2
而最小宽度和小数位数这两个限定值,都可以 * 代替,通过 printf() 的参数传入。(可以类比占位符理解)
printf也可以输出部分字符串,%s 占位符用来输出字符串(默认是全部输出)
如果只想输出开头的部分,可以用 %.[m]s 指定输出的长度,其中 [m] 代表一个数字,表示所要输出的长度。
比如这个例子中,最后输出的是前五个字符,也就是“hello”
#include <stdio.h>
int main()
{
printf("%.5s\n", "hello world");
return 0;
}
2.scanf
printf用于输出值,而scanf用于给变量输入值。
比如在如下例子中:
#include <stdio.h>
int main()
{
int score = 0;
printf("请输入成绩:");
scanf("%d", &score);
printf("成绩是:%d\n", score);
return 0;
}
运行后先是显示:“请输入成绩:”
需要我们自己输入一个数,才会接着输出“成绩是..”
scanf( )函数用于读取用户的键盘输入。
程序运行到这个语句时,会停下来。等待用户从键盘输入。 用户输入数据、按下回车键后, scanf( )就会处理用户的输入,将其存入变量。
而scanf的头文件和printf一样,都是stdio.h
scanf( )的语法跟printf( )类似。
写作:scanf("%d", &i);
它的第一个参数是一个格式字符串,里面会放置占位符(与printf( )的占位符基本一致)。格式字符串里面有多少个占位符,就有多少个变量。
因为C语言的数据都是有类型的, 所以scanf( )必须提前知道用户输入的数据类型,才能处理数 据。
注意:变量前面必须加上 & 运算符(指针变量除外),因为 scanf( )传递的不是值,而是地址, 即将变量 i 的地址指向用户输入的值。
如果这里的变量是指针变量(如字符串变量),那就不用加&运算符。
scanf( )处理数值占位符时,会自动过滤空白字符,包括空格、制表符、换行符等。所以,用户输入的数据之间,有一个或多个空格不影响scanf( )解读数据。另外,使用回车键分成几行,也不影响解读。
scanf( )处理用户输入的原理是,用户的输入先放入缓存,等到按下回车键后,按照占位符对缓存 进行解读。
比如这个例子:
#include <stdio.h>
int main()
{
int x;
float y;
// 用户输入 " -13.45e12# 0"
scanf("%d", &x);
printf("%d\n", x);
scanf("%f", &y);
printf("%f\n", y);
return 0;
}
第一次,scanf( )读取用户输入时, %d占位符会忽略起首的空格,从 - 处开始获取数据,读取到 -13 停下来,因为后面的 . 不属于整数的有效字符。也就是说,占位符 %d 会读到 -13 。
第二次,会从上一次停止解读的地方,继续往下读取。所以读取的是.45e12,由于#不属于浮点数的有效字符,所以到此为止
scanf( )的返回值是一个整数,表示成功读取的变量个数。
如果没有读取任何项,或者匹配失败,则返回0 。
如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量 EOF (-1)( EOF - end of file 文件结束标志)
scanf( )的常用占位符与printf( )的占位符基本一致
%d %f %lf %Lf %s %[]都会自动忽略起首的空白字符。
%c 不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格。
写成 scanf(" %c", &ch),可强制跳过字符前的空白字符,即%c前加上个空格,表示跳过零个或多个空白字符。
占位符%s其实不能简单地等同于字符串。它的规则是,从当前第一个空白字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)为止。
也就是说scanf( )不适合读取可能包含空格的字符串,如书名或歌名等
scanf( )读取字符串时,不会检测字符串是否超过了数组长度。所以,储存字符串时, 很可能会超过数组的边界,造成不可知的后果。为了防止这种情况,使用%s占位符时,应该指定读区字符串的最大长度,即写成%[m]s ,其中的 [m] 是一个整数,表示读取字符串的最大长度,最大长度以外的余下内容就会被丢弃,避免超出数组边界的情况出现。
scanf( )还提供了一个赋值忽略符 * 。 只要把 * 加在任何占位符的百分号后面,该占位符就不会返回值,解析后将被丢弃。主要就是因为用户的输入可能不符合预定的格式,导致scanf( )解析数据失败,而使用赋值忽略符可以忽略解析错误的情况,直接继续向后读取,不会再返回报错等情况。
以上就是今天关于printf和scanf的补充内容。。