目录
一、scanf
scanf() 处理数值占位符时,会自动过滤空白字符,包括空格、制表符、换行符等。
scanf() 处理用户输入的原理是,用户的输入先放入缓存,等到按下回车键后,按照占位符对缓存进行解读。 解读用户输入时,会从上一次解读遗留的第一个字符开始,直到读完缓存,或者遇到第一个不符合条件的字符为止。
#include<stdio.h> int main() { int a = 0; float b = 0; scanf("%d", &a); //输入 3.141592 #6 printf("%d\n", a); //输出 3 scanf("%f", &b); printf("%f", b); //输出0.141592 return 0; }
占位符中除了 %c ,都会忽略起首的空白字符,如果需要强制跳过空白字符,可以
scanf(" %c", &ch); //百分号前加一个空格
scanf 有返回值
如果返回一个整数,代表成功读取的变量个数;
如果没有读取任何项,或者比配失败,返回 0;
如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量 EOF (-1)。
可以使用下面这行代码实现循环输入,想结束就按3次 Ctrl+Z
while (scanf("%d", &a) != EOF)
%s 定义的规则是,从当前第一个非空白字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)为止;意味着 scanf() 不适合读取可能包含空格的字符串;
scanf 遇到 %s 占位符时,会在字符串变量的末尾存储一个 \0;
scanf 将字符串读入字符数组是,不会检测字符串是否超出了字符数组的长度;所以使用 %s 时,应指定读入字符串的最大长度,即写成 %[m]s , [m]是一个整数,以防止出现意想不到的结果,不会出现数据溢出的风险了
#include<stdio.h> int main() { char name[10] = "0"; scanf("%10s", name); printf("%s", name); return 0; }
赋值忽略符 *
#include<stdio.h> int main() { int year = 0; int month = 0; int day = 0; scanf("%d%*c%d%*c%d", &year, &month, &day); //输入2024/4/9 printf("%d %d %d", year, month, day); //输出2024 4 9 return 0; }
二、printf
指定打印的最小宽度,默认是右对齐,改为左对齐需加一个负号。
#include<stdio.h> int main() { int num = 12345; printf("%d\n", num); //输出 12345 printf("xx%7dxx\n", num); //输出 xx 12345xx printf("xx%-7dxx\n", num); //输出 xx12345 xx return 0; }
正号默认是不显示的,想显示正号可以
#include<stdio.h> int main() { printf("%d\n", 12); //输出 12 printf("%+d\n", 12); //输出 +12 return 0; }
限定小数位的长度 ,希望小数位只保留几位
#include<stdio.h> int main() { float a = 3.141592; printf("%f\n", a); //输出 3.141592 printf("%.4f\n", a); //输出 3.1416 (四舍五入) return 0; }
输出部分字符串
#include<stdio.h> int main() { printf("%.5s", "Hello world"); //输出 Hello return 0; }
可以搭配使用,最小宽度和小数位数这两个限定值,都可以用 * 代替,通过 printf() 的参数传⼊。
#include<stdio.h> int main() { float a = 3.141592; printf("xx%5.2fxx\n", a); //输出 xx 3.14xx printf("xx%-5.2fxx\n", a); //输出 xx3.14 xx printf("xx%*.*fxx\n", 5, 2, a); //输出 xx 3.14xx return 0; }
完