在写c语言时,printf和scanf是我们必不可少且常用的关键字,相信大多数人对它们俩的认识只是停留在表面上,并没有深入了解过它们吧,那么这一篇文就来深入对它们俩来说道说道
Printf
Printf:输出函数,将参数输出到屏幕上
案例:
int main()
{
printf("hello \nworld\n");
return 0;
}
printf("hello \nworld\n"):将hello word打印到屏幕上,在使用printf函数时可以多次使用换行符\n,想在哪里加都可以 |
占位符
占位符:在printf中,占位符可以被指定的数值替换
案例:
int main()
{
printf("there are 3 apples\n");……1
printf("there are %d apples\n", 3);……2
printf("there are %d apples\n", 6);……3
printf("%s will come to tonight\n", "李四");……4
printf("%s says it is %d O'clock\n", "lisi", 21);……5
return 0;
}
|
常见占位符
%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 类型 |
%% |
输出⼀个百分号 |
限定宽度
限定宽度:限定占位符的最小宽度
案例:
int main()
{
printf("%5d\n", 123);
printf("%-5d\n", 123);
printf("%12f\n", 123.45);
printf("%12f\n", 123.45);
return 0;
}
|
结果:
总是显示正负号
让正负号显示出来,但其实默认负号本身就要显示,所以可以说是怎么显示正号
案例:
int main()
{
printf("%+d\n", 12);
printf("%+d\n", -12);
return 0;
}
|
限定小数位
限定小数位:因为小数默认显示6位,但我们是可以进行限定小数后面的位数的
案例:
int main()
{
printf("%f\n", 123.45);
printf("%.2f\n",123.45);
printf("%6.2f\n", 0.5);
printf("%*.*f\n",6,2,0.5);
return 0;
}
|
注意:如果限定的位数大于实际位数,系统会补上零
输出部分字符串
输出部分字符串:%s占位符用来输出字符串,默认是全部输出。如果如果只想输出开头的部分,可以⽤ %.[n]s指定输出的⻓度,其中[m]代表⼀个数字,表⽰所要输出位宽
案例:
int main()
{
printf("%.5s\n", "hello world");
return 0;
}
printf("%.5s\n", "hello world"):以字符串的形式打印hello world,.5表示只要5位宽,和上面的概念一样,故最终结果就只有 hello |
那么对printf的解说就结束了
Scanf
Scanf:定义了变量后,scanf可以接受用户输入的内容并且存放到指定位置
案例:
int main()
{
int a = 0;
printf("请输入成绩:");
scanf("%d", &a);
printf("成绩=%d", a);
return 0;
}
|
注意:遇到scanf的安全问题请参考“变量的使用中注意”来解决,然后不要忘了scanf有取地址符号&
基本用法
Scanf的语法和printf的语法基本相同,还有scanf()必须提前知道数据的整型,也就是%什么,语句中有几个占位符,就必须有几个变量
案例:
int main()
{
int a = 0;
int b = 0;
float x = 0.0;
float y = 0.0;
scanf("%d %d %d %f %f", &a, &b, &x, &y);
printf("%d %d %d %f %f", a, b, x, y);
return 0;
}
|
注意:scanf函数不能加\n,并且用户输入时,要空格或用制表符或回车
补充:scanf函数再处理占位符时,会自动过滤空白字符,空格,回车,换行,制表符
补充:处理⽤⼾输⼊的原理是,⽤⼾的输⼊先放⼊缓存,等到按下回⻋键后,按照占位符对缓存进⾏解读。解读⽤⼾输⼊时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条件的字符为⽌。
案例:
int main()
{
int x;
float y;
// ⽤⼾输⼊ " -13.45e12# 0"
scanf("%d", &x);
scanf("%f", &y);
printf("%d\n", x);
printf("%d\n", y);
return 0;
}
|
Scanf的返回值
Scanf的返回值:scanf的返回值是一个整型,表示成功读取的变量个数,如果没有读取任何项,或则匹配失败,则返回0,如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量EOF
案例:
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;
}
|
注意:如果此时想让r=2,那么就可以在运行时只输入两组数据,然后安ctrl+z,但由于vs的bug,vs环境下需要按3次ctrl+z
EOF:end of file 文件的结束,EOF的值为-1,在上面的例子中,如果什么都不输入按ctrl+z后回车 那么r此时就等于-1
占位符
占位符:scanf的占位符和printf的占位符相似
%[] |
在方括号中指定一组匹配的字符(比如%[0-9]),遇到不在集合之中的字符,匹配将会停止 |
上⾯所有占位符之中,除了 %c 以外,都会⾃动忽略起⾸的空⽩字符。 %c 不忽略空⽩字符,总是返 回当前第⼀个字符,⽆论该字符是否为空格
案例:
int main()
{
char x = 0;
scanf("%c", &x);
printf("%c", x);
printf("xxxx");
return 0;
}
|
下⾯要特别说⼀下占位符 %s ,它其实不能简单地等同于字符串。它的规则是,从当前第⼀个⾮空⽩ 字符开始读起,直到遇到空⽩字符(即空格、换⾏符、制表符等)为止
案例:
int main()
{
char x[20] = { 0 };
scanf("%s", x);
printf("%s", x);
return 0;
}
|
因为 %s 不会包含空⽩字符,所以⽆法⽤来读取多个单词,除⾮多个 %s ⼀起使⽤。这也意味着, scanf() 不适合读取可能包含空格的字符串,⽐如书名或歌曲名。另外, scanf() 遇到 %s 占位 符,会在字符串变量末尾存储⼀个空字符 \0
scanf() 将字符串读⼊字符数组时,不会检测字符串是否超过了数组⻓度。所以,储存字符串时, 很可能会超过数组的边界,导致预想不到的结果(系统会提示崩溃)。为了防⽌这种情况,使⽤ %s 占位符时,应该指定 读⼊字符串的最⻓⻓度,即写成 %[n]s ,其中的 [n] 是⼀个整数,表⽰读取字符串的最⼤⻓度,后⾯的字符将被丢弃(这就是scanf不安全的原因)
案例:
int main()
{
char x[5] = { 0 };
scanf("%4s", x);
printf("%s\n", x);
return 0;
}
|
赋值忽律符
赋值忽律符:有时,⽤⼾的输⼊可能不符合预定的格式
案例:
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d-%d-%d", &year, &month, &day);
scanf("%d%*c%d%*c%d", &year, &month, &day);
return 0;
}
|
好了,关于printf和scanf的讲解都结束了
如有错误请指出