printf() 是 C 语言标准库函数,用于将格式化后的字符串输出到标准输出。
(输出表列中给出了各个输出项,要求格式控制字符串和各输出项在数量和类型上应该一一对应。)
格式化字符串包含三种对象,分别为:
字符串常量原样输出,在显示中起提示作用。
占位符是以 % 开头的字符串,在 % 后面跟有各种格式控制符,以说明输出数据的类型、宽度、精度等。
转义字符在字符串中会被自动转换为相应操作命令。
#include
int main()
{
printf("%5d\n", 123456);
return 0;
}
输出结果为
123456
- 减号 | 结果左对齐,右边填空格。默认是右对齐,左边填空格。 |
+ 加号 | 输出符号(正号或负号) |
space 空格 | 输出值为正时加上空格,为负时加上负号 |
# 井号 | type是o、x、X时,增加前缀0、0x、0X。 |
例如:
printf("%5d\n",1000); //默认右对齐,左边补空格
printf("%-5d\n",1000); //左对齐,右边补空格
printf("%+d %+d\n",1000,-1000); //输出正负号
printf("% d % d\n",1000,-1000); //正号用空格替代,负号输出
printf("%x %#x\n",1000,1000); //输出0x
printf("%.0f %#.0f\n",1000.0,1000.0)//当小数点后不输出值时依然输出小数点
printf("%g %#g\n",1000.0,1000.0); //保留小数点后后的0
printf("%05d\n",1000); //前面补0
输出结果:
1000
1000
+1000 -1000
1000 -1000
3e8 0x3e8
1000 1000.
1000 1000.00
01000
scanf() 是 C 语言标准库函数,用于读取键盘输入的数据。
此函数的参数组成和printf()函数的参数组成很类似,就不再赘述。
例如:
#include
int main(void)
{
int a,b,c;
printf("请输入三个数字:");
scanf("%d%d%d",&a,&b,&c);
printf("%d,%d,%d\n",a,b,c);
return 0;
}
键盘输入:
1 2 3
输出结果:
1,2,3
#include
int main(void)
{
char a;
scanf("%c", &a);
printf("%cXXXX", a);
return 0;
}
如果要强制跳过字符前的空⽩字符,可以写成 scanf(" %c", &ch),即 %c 前加上⼀个空格,表示跳过零个或多个空⽩字符。
#include
int main(void)
{
char a;
scanf(" %c", &a);
printf("%cXXXX", a);
return 0;
}
特别说⼀下占位符 %s ,它其实不能简单地等同于字符串。它的规则是,从当前第⼀个⾮空⽩字符开始读起,直到遇到空⽩字符(即空格、换⾏符、制表符等)为止。
#include
int main()
{
char name[11];
scanf("%10s", name);
printf("%s\n", name);
return 0;
}
上⾯示例中, name 是⼀个⻓度为11的字符数组, scanf() 的占位符 %10s 表示最多读取用户输⼊的10个字符,后⾯的字符将被丢弃,这样就不会有数组溢出的⻛险了。
如果不写成写%[m]s ,如下图
#include
int main()
{
char name[11];
scanf("%s", name);
printf("%s\n", name);
return 0;
}
则如果输入的字符超过了数组的容量,输入 abcdefghijklmn 输出情况如下:
造成数据溢出,报错。
#include
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d-%d-%d", &year, &month, &day);
return 0;
}
上⾯示例中,如果用户输⼊ 2020-01-01 ,就会正确解读出年月日。但是如果用户输入的是其他格式,比如2020/01/01 ,这种情况下scanf() 解析数据就会失败。
为了避免这种情况, scanf() 提供了⼀个赋值忽略符(assignment suppression character) * 。只要把 * 加在任何占位符的百分号后⾯,该占位符就不会返回值,解析后将被丢弃。
例如:
#include
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d%*c%d%*c%d", &year, &month, &day);
return 0;
}
上⾯示例中, %*c 就是在占位符的百分号后⾯,加⼊了赋值忽略符 * ,表示这个占位符没有对应的变量,解读后不必返回。
#include
int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
}
return 0;
}
当上面的程序运行时,如果不加" != EOF",那么这个程序就是个死循环,会一直运行下去;加上" != EOF"后该程序就不是死循环了,如果在终端不进行输入该程序会自动结束(while的意思就是说当当前输入缓存还有东西时就一直读取,直到输入缓存中的内容为空时停止)。
在这"scanf(“%d”,&n) != EOF"相当于"scanf(“%d”,&n) != EOF",或"~scanf(“%d”,&n)“,或"scanf(”%d",&n) == 1 " 。scanf的返回值由后面的参数决定。
要注意的是:在终端(黑框)中手动输入时,系统并不知道什么时候到达了所谓的“文件末尾”,因此需要用
一般就VS来说,可能需要按3次 ctrl+z .
————————————————
使用时要包含头文件,即 #include
参考数据来源:https://blog.csdn.net/henu1710252658/article/details/83040281 ↩︎