输入输出: 1、控制语句 2、函数调用语句 3、表达式语句 4、空语句 5、复合语句
程序的主要输入输出流程如下:
输入设备-- 运算器 + 控制器 ---- 输出设备
存储器
也可也这样看:
输入 ---> 内存 ---> 输出
int putchar(int c); //形参 --- 形式参数 可以被实际的值替换 他只是一个形式int c。本身是一个变量。
功能:
输出一个字符
参数:
@c 要输出的字符的ascii码值
返回值:
成功 返回输出了的字符的ascii码值
失败 EOF(实际上这个值是-1)
eg:
char c = 'a';
putchar(c); // 输出c中ascii码值对应的字符是 -1 )
int getchar(void);
功能:
从键盘获取一个字符
参数:
void 表示空类型,在函数形参表示没有参数
返回值:
成功 返回读到了的字符的ascii码值
失败 返回一个 -1
eg:
c = getchar(); //c将保存getchar从键盘获得道德字符的ascii码值
格式化输出函数
printf(const char *format, ...) // ...表示可变参数--参数数量是可以变化的
int printf(格式控制字符串,输出表列);
eg:
printf("a = %d\n",a); //就是我们平常使用的printf输出打印
格式控制字符串:
占位符 //将来要被后面的参数值替换掉 --格式转换
整型类型:
%d 以有符号十进制的格式输出
%u 以无符号十进制格式输出
%o 以八进制格式输出
%x 以十六进制格式输出
%X 表示输出的十六进制中的字母变成大写
浮点类型:
%f 以十进制形式的小数输出,默认保留六位小数
%e 以科学计数法的形式输出 //示例 f = 1.234567e+02 E 可以大写 输出的e也是大写
%g 以 %f 和 %e 更简洁的方式输出,输出结果中不会保留没有意义的0
字符型;
%c 以字符的形式输出
%s 以字符串的形式输出 使用方法:// printf(“%s”,“abcd”);
辅助控制符:
# %#o //以八进制格式输出,前面带上一个0
%#x //以十六进制的格式输出,前面带上0x
---------------------------------------------------------------------------------------------------------------
在输出的时候也可也加上类似%5.2d这种
m.n m输出的宽出 //列数
%5d //5表示输出的宽度 要是输出的数据比设定的宽度更长,可以完整输出 不够的话默认右对齐,前面空的地方补0
%05d //前面的要补空格的地方变成补 0
(上面是右对齐,实际上也可以左对齐: %-5d // -这个就表示左对齐)
浮点数:
对于浮点类型的数据:
%.2f //保留两位小数
( 当%5.2f 时 小数点也占一个宽度)
字符串:
保留前n个字符 -----> %.2s
%ld // long的意思
%lld //-- long long int
%Lf //表示输出 long double 注意 L 要大写
注意:
一个占位符只能匹配一个参数
对于普通字符 程序会原样输出
scanf 格式化输入函数
scanf(const char *format,...);
scanf格式:
scanf("格式控制字符串",地址列表);
int a;
scanf("%d",&a);
scanf(“a = %d”,&a); //这个在使用的时候 需要先输入a = 再输入要输入的数,所以在使用的时候尽量不输入普通字符。
若是输入的时候,不加&只写a,b,c 那a,b,c,本身代表的值 当作了地址。但这些地址可能对应到了不能访问的空间,代码运行之后会导致“段错误”
参数:
格式控制字符串:
普通字符 //原样输入
占位符
整型
%d // 表示将输入的数据 转换为 十进制的格式 只识别能转换成十进制的
%x // 将输入的字符串 转换为 十六进制的格式
%o // 将输入的字符串 转换为 八进制格式
浮点型
%f //将输入的数据转换成小数的格式 只识别能转换成小数的那些(科学计数法也可以eg:1.2e3)
%Lf //表示将输入的浮点型的数据 ,转换为double类型的数据
%e
%g //都能转换浮点形式的数据 默认都是float类型
%Le %Lg ======-------> 这两个就转换成了double类型
字符型
%c //将输入的数据转换为 字符数据
%s //将输入的数据转换为字符串数据
scanf要输入多个数据的时候可以用回车或者空格来隔开各个数据 //输入多个数据的时候,数据之间可以使用”空白符“来隔开
//空白符(Tab space enter)
scanf注意
Segementation (分段) fault(core dumped) //段错误
错误的原因:
主要原因,代码试图访问不能访问的内存空间。
scanf中 占位符 与地址列表 的个数 要匹配
scanf 地址列表中注意得是有效地址
eg:
int a = 10;
scanf("%d",a); //此时a被当地址使用了不是一个有效的地址
--------------------------------------------------
辅助控制符
m.n //m 是宽度 --在输入时 表示制定了输入数据的宽度
//一旦达到宽度时,表示,此次输入结束
eg:
scanf(“%3x”,&a);//如果输入的数据以及匹配了3个字节的宽度 则表示scanf识别结束
123456
12\n
.n //输入时,不能制定所谓的精度
在输入的时候只能加宽度 和给不同大小的数据
----------------------------
输入缓冲区:
//缓冲区是一块内存
输入的数据都先被输入到缓冲区,scanf到缓冲区进行数据的匹配。
连续输入两个字符的时候 中间的分割空格也会被识别成字符,所以在连续输入的时候
要在中间加上空格 ==== 或者===== %*c%c %*d%d
注:
%*c // 可以匹配一个数据项,匹配走的数据项并不给到任何变量空间中
scanf(“%d ”);
scanf(“%d\n”); 如果出现空白符,表示 从输出中匹配任意多个空白符
scanf匹配结束的情况:
1、遇到空白符(回车 空格 Tab)
scanf(“%d%d”,&a,&b);
123 456 //
2、到达指定的宽度
scanf(“%3d”,&a); // 123456 === 最终只读到123
3、遇到非法字符
scanf(“%d%d”,&a,&b); //123a456
123 ---a对于%d就是非法字符
while(getchar()!= '\n'); // 这段可以清除缓冲区的数据