格式控制符
1.常见的格式控制符号
%c :字符型
%d :整型
%hd :短整型
%ld :长整型
%hu :无符号短整型
%f :单精度浮点型
%lf :双精度浮点型
%s :字符串型
%p :指针型
%x :十六进制
%o :八进制
%#x :十六进制会加上前缀0x
%#o :八进制会加上前缀0
%i :可以打印十进制,也可以获取键盘输入的八进制(输入的时候加上0)和十六进制(输入的时候加上0x)
%X :十六进制,遇到字母用大写表示
2.位宽和小数位数设置
%10d :10表示位宽,正的10表示输出的数据靠右边
%-10d :10表示位宽,负的10表示输出的数据靠左边
%10.5f :10表示位宽,小数点后面的5表示保留5位小数
%.5f :小数点后面的5表示保留5位小数
注意:位宽设置规律
位宽大于数据原本的位数–》填充空格来凑齐位宽
位宽小于数据原本的位数–》数据原样输出,不会截取
3.转义字符
\n :回车转义了
\ :打印\,\必须转义,单独的\编译语法错误
\\ :打印两个斜杠
双引号嵌套,里面的双引号必须转义
‘\14’或者’\17’ :是个字符,只能是八进制的数,前面不要写上0
‘\x89’或者’\xa1’ :是个字符,只能是十六进制的数
4.续行符
作用:当你写的一句代码,逻辑上是个整体,但是你有需要切换到多行去写,此时就要使用续行符
格式化IO函数
1.作用
printf:用于在屏幕(标准输出)上输出各种类型的数据
scanf: 用于获取键盘(标准输入)输入的各种类型数据
2.原理和注意的问题
printf和scanf共用一个缓冲区
(1)printf的工作原理
原理:先把数据存放到缓冲区中,遇到回车,return exit() 缓冲满了 scanf和printf切换使用的时候就会刷新缓冲区,在液晶屏(终端)上显示。
注意问题:
printf("%d\n",a);
printf("%d %f %lf %s",a,b,c,d);
exit(0); //结束程序,刷新缓冲区
return 0; //结束程序,刷新缓冲区
_exit(0) //结束程序,不刷新缓冲区
简要概括:
输入以下代码时终端不会打印hello world
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("hello world"); //没有输出
_exit(0);
}
(2)scanf的工作原理
读取单个变量:scanf(“%d”,&a);
读取多个变量:scanf(“%d%f%lf”,&a,&b,&c); //a,b,c跟前面格式符号对应
注意:中间不要加回车,也不要加空格
#include <stdio.h>
int main()
{
int a;
float b;
double c;
scanf("%d%f%lf",&a,&b,&c);
printf("a = %d\n",a);
printf("b = %f\n",b);
printf("c = %lf\n",c);
return 0;
}
/*
执行结果
输入:
2
34.5
34.55
输出:
a = 2
b = 34.500000
c = 34.550000
*/
简要概括:
(3)解决scanf遇到的问题
1、scanf如何判断用户输入的数据是否符合要求
解决办法:通过scanf的返回值来判断,scanf的返回值表示用户输入的符合要求的数据个数
#include <stdio.h>
int main()
{
int a,b,c;
//定义变量保存scanf的返回值
int ret;
printf("输入三个整数\n");
ret = scanf("%d%d%d",&a,&b,&c);
printf("scanf的返回值是%d\n",ret);//scanf的返回值只保存正确输入的值
}
/*
执行结果:
输入三个整数
1
2
sdgdfg
scanf的返回值是2
*/
2、输入一个整数,然后输入一个字符
输入完整数以后,回车会被当成字符读取了,导致不能输入新的字符
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int a;
char b;
printf("请输入一个整数和一个字符!\n");
scanf("%d",&a);
//你刚才输入完整数以后,会敲个回车,回车会被当成字符读取
scanf("%c",&b);
//打印输入的结果
printf("您刚才输入的数据是: %d %c\n",a,b);
return 0;
}
解决方法:调用C语言的库函数getchar()
int getchar(void); //从缓冲区里面读取一个字符
返回值:你读取到的字符的ASCII码值
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int a;
char b;
int ret;
printf("请输入一个整数和一个字符!\n");
scanf("%d",&a);
//主动清除缓冲区里面残留的\n
ret=getchar();
printf("getchar从缓冲区里面读取的字符,ASCII码值是: %d\n",ret);
scanf("%c",&b);
//打印输入的结果
printf("您刚才输入的数据是: %d %c\n",a,b);
return 0;
}
3、scanf(“%d”),输入123hello会把123读取出来
scanf(“%d”),输入12.36会把12读取出来
解决方法:getchar调用判断后面一个字符是不是\n
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int a,ret,n;
printf("输入一个整数\n");
ret = scanf("%d",&a);
//判断用户输入的内容是否存在整数
if(ret == 1)
{
//进一步判断,排除123hello,23.4这两种情况
//马上从缓冲区里面读取一个字符来判断
n = getchar();
if(n !='\n')
{
printf("sorry,输入的不是整数\n");
}
else
{
printf("输入的是整数\n");
}
}
else
{
printf("输入的不是整数\n");
}
return 0;
}
4、scanf读取字符串,遇到空格会结束读取
空白字符在起始位置遇到不会结束读取,在中间位置遇到就会结束读取
空白字符有:回车、空格、制表符
解决方法:scanf(“%[^\n]”,str); //读取到\n才结束 [^\n]是正则表达式