一.printf
- printf是库函数,使用时需要引用 include <stdion.h> ,作用是把想输出的数据输出在屏幕上
- 我们也可以搭配占位符来格式化要输出的数据,常见的占位符有
%c 输出字符 例如 printf("%c", 'a'); %s 输出字符串 例如 printf("%s", "hello world"); %f 输出float类型的小数 例如 printf("%f", 3.14f); %lf 输出double类型的小数(精度更高) 例如 printf("%lf", 3.14); %d 输出10整数 例如 printf("%d", 10); %p 输出指针 %d 输出整数 例如 printf("%d", 10); %u 输出unsigned int(无符号整形) 例如 printf("%u", 10); %zd size_t类型 例如 printf("%zd", sizeof(int)); 这里重点说下%zd,这是用来搭配sizeof()来使用的,sizeof是用来求数据类型所占的字节大小,由于所求类型的大小一定是正数所以sizeof的返回类型一定是无符号的整形,那么无符号的整型又分为 unsigned short int,unsigned int,unsigned long,unsigned long long,在不同的编译器下返回的类型也大不相同,为了代码的可移植性,C语言就创建了size_t来统一表示sizeof的返回类型。
- printf()参数与占位符是一一对应关系,如果有n个占位符,printf()的参数就应该有n+1个
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { printf("%s age is %d\n", "ck", 100); return 0; }
这里可以看出有三个参数,第一个参数中的%s对应的就是第二个参数的ck,第一个参数的%d对应的就是第三个参数的100
- printf控制浮点数小数点后可以输出的位数
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { printf("%6.2f", 123456.1111); //这里输出的是 123456.11 //6表示最少可以输出6位,超出了也照样输出 //.2表示小数点后最多只可以输出2位,超过小数点后2位的值就不在输出 return 0; }
- printf搭配#可以把进制前置修饰符显示出来
#include <stdio.h> int main() { int a = 1234; printf("%#o %#X",a,a); return 0; }
运行结果
二.scanf
- scanf是库函数,使用时需要引用 include <stdion.h> ,作用是将输入的数据转化成规定格式的数据然后赋给输入变量的地址中。
-
scanf会⾃动跳过空⽩字符,包括空格、制表符、换⾏符
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { int a = 0; printf("请输入一个整数:"); scanf("%d", &a); printf("%d\n", a); return 0; }
运行结果 由此可见10前面的空格都被过滤掉了
-
scanf从键盘读取的数据一开始是放在缓存区中的,直到按了Enter,数据才会按照自己定义的规定存放在要赋给变量的地址中
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { int a = 0; double b = 0; char c = '0'; printf("请输入一段数据:"); scanf("%d", &a); scanf("%lf", &b); scanf("%c", &c); printf("a = %d b = %lf c = %c\n", a, b, c); printf("字符c的ASCII值=%d\n", c); return 0; }
两份运行结果
-
我们看第一份和第二份运行结果中a和b的值都是十分正常的,但是第一份中的字符c却没有跟我们想的一样有读取到#,而是把空格给读取到了,空格ASCII是32 ,而在第二份中因为我在6后面直接按了Enter所以字符c就直接读取到了'\r',回车的ASCII是10,所以我们可以看出scanf搭配占位符除了%c都有把空格或者把回车给过滤掉,那如何可以使scanf搭配%c也可以把回车和空格给过滤掉?
-
解决方法就是scanf(" %c", &c); 在%c前面加个空格。
-
scanf控制存放长度
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { char array[11]; scanf("%10s", array); printf("%s\n", array); return 0; }
运行结果
-
结 论:超过了10位就不会存放在array中了,这样可以避免在使用scanf的时候导致array溢出。这里有个注意点就是scanf搭配%s会在末尾会自动加'\0',也就是说如果我们这里把10改成11那么'\0'就没有空间给它存储了,输出就会得到乱码。