一.输入输出
(1).C语言本身并不提供输入输出功能。
使用的是C语言函数库中的 "标准输入输出" 函数
所以需要加上 <stdio.h> 头文件
(2).C语言函数库提供的输入输出函数
getchar/putchar //操作一个字符 'a'
gets / puts //操作一个字符串 //"abcd"
scanf/printf //格式化的函数
二.函数
(1)getchar 从键盘获取一个字符
eg:
int ret;
ret = getchar(); //表示获取到getchar读取的字符的ASCII的值
#include <stdio.h>
int main(void)
{
int ret;
ret = getchar();
printf("ret = %c ; %d\n",ret,ret);
return 0;
}
每次输入完字符会点击回车,这样才能让getchar读取字符
实际上在getchar读取字符时有一个缓冲区在发挥作用,会先把字符放在缓冲区
getchar()清除缓冲区,getchar从缓冲区中读取字符并丢弃,直到遇到特定的条件。
当我们在终端输入字符时,字符首先会被存储到缓冲区中等待程序读取。在某些情况下,需要清除缓冲区中的所有字符,确保后续的输入操作不受之前的输入的影响。这个时候可以重复调用getchar()实现。
如果不清楚缓冲区的话,输入1 2 b,b会被一直存放在缓冲区,每次的while判断条件都成立,将会一直循环,打印input again
(2)putchar 输出一个字符
eg:
putchar('a');
#include <stdio.h>
int main(void)
{
char ch = getchar();
putchar(ch);
printf("\nch = %c : %d\n",ch,ch);
return 0;
}
(3)printf() //格式化输出函数
eg:
printf("a = %d\n",10); //a = 10
int printf(const char *format, ...);
... //表示 可变参数
printf("hello world!\n");
printf("a = %d\n",a);
printf("a = %d b = %f c = %c\n",a,b,c);
printf("格式控制字符串",输出参数列表);
printf("a = %d\n",a);
格式控制字符串
a.普通字符 --- 原样输出
b.占位符 --- 匹配后面的输出参数的
%d 将后面的输出参数 转换为 有符号十进制 形式输出
整型
%d --- 转换为 有符号 十进制形式
%u --- 转换为 无符号 十进制形式
%o --- 转换为 八进制形式
%x --- 转换为 十六进制形式
%X --- 转换为 十六进制形式 a b c d e f以大写形式输出
0X //x也会是大写
浮点型
%f --- 转换为 十进制形式的小数,输出时默认保留6位小数,不足6位 补0
%e --- 转换为 科学计数法的形式
%E 指数形式中e 变成 大写 E
%g --- 以 一种 更简洁的方式输出,同时不会输出无意义的0
字符型
%c --- 转换为字符形式输出
%s --- 转换为字符串形式输出
占位符
%[辅助控制符]d
辅助控制符:
# ---- %#x //打印带前缀的16进制 如0x7B
%#o //打印带前缀的8进制 如0331
m ---- 数字 表示要输出的数据的宽度
如果数据本身的宽度 > m 此时按照实际宽度输出
如果数据本身的宽度 < m 此时按照m宽度输出,空出来的位置 填空格
默认右对齐
-m ---- 按指定宽度输出 ,左对齐 (负号表示左对齐)
0m ---- 多出来的位置 可以填充0
-0m ----0只在右对齐时填充,左对齐无效
.n ---- n数字
%f //%.2f //表示保留2位小数
%e
%s //表示 保留前n个字符
l ---- long
ll ---- long long //整型
h ---- half
hh ---- half half
注意:
占位符 与 输出参数 一 一对应
(4)scanf //格式化输入函数
格式:
scanf("格式控制字符串",地址列表)
#include <stdio.h>
int main(void)
{
int a,b;
float x,y;
char c1,c2;
scanf("%d %d %f %f %c %c",&a,&b,&x,&y,&c1,&c2);
printf("a = %d b = %d x = %.1f\ny = %.2f c1 = \'%c\' c2 = \'%c\'\n",a,b,x,y,c1,c2);
return 0;
}
格式控制字符串 //与printf中的 一样
scanf("a = %d");
a.普通字符 --- 原样输入
b.占位符 --- 将从键盘输入的数据 转换成指定的格式
地址列表
int a;
scanf("a = %d",&a);
注意&取地址;
辅助控制符
%d
m //数据宽度 ---输入宽度
%lf //输入的时候 ,要做到精确匹配
%f --- float
%lf --- double
%Lf --- long double
%ld --- long
%lld --- long long
如printf("sizeof(10) = %ld\n",sizeof(10));
注意:
1. scanf 格式控制字符串中 尽量不出现 普通字符,一般只写 占位符
2. scanf 的地址列表中,一定是有效的地址
3. scanf 输入结束的条件(匹配结束的条件)
%d
[12g3]
a.遇到非法字符 匹配结束,这里的g是char型,不是int型属于非法字符
b.遇到空白符 匹配结束
空白符 (空格 回车 tab)
[1 2 3]
scanf("%d",&a);
scanf("%d",&b);
scanf("%d",&c);
c.超过指定的宽度 结束
scanf("%3d",&a);
4. scanf的格式控制字符串中,如果出现 空白符 ,表示匹配任意多个空白符
%*c 表示 匹配一个数据项 但是并不把这个数据给到任何一个变量中
在编译时如果产生Segmentation fault (core dumped) //这是段错误 --- 产生原因:
//访问到了 不能访问的内存空间