C语言中的输入和输出:
输入:
主要使用scanf函数:
功能:从标准输入(一般是键盘)获得数据。
格式:scanf(格式描述串,变量地址);(如:int a; scanf("%d",&a);)
需求引用的库:stdio.h (这也是为什么几乎所有C语言程序的开头总是一句"#include
格式控制符:
格式控制符 | 作用 | 举例 |
%d , %i , %ld , %hd | 用来输入整型(int)数据,其中%ld(小写L)用于输入长整型,%hd用于输入短整型 | int a; scanf("%d",a); |
%o , %lo , %ho | 用来输入八进制整数,其中%lo用于输入长整型,%ho用于输入短整型 | int a; scanf("%o",a); |
%x , %X , %lx , %hx.... | 用来输入十六进制整数,其中x的大小写决定输入的十六进制数中英文字母的大小写,l和h的作用同上 | int a; scanf("%x",a); |
%u , %lu.... | 用来输入无符号十进制数,l和h的作用同上 | unsigned int a; scanf("%u",a); |
%c | 用来输入单个字符。 | char a; scanf("%c",a); |
%f , %lf | 用来输入浮点数,其中%f用来输入单精度型数(float),%lf用来输入双精度型数(double) | float a; scanf("%f",a); |
输入数据的分割:
代码1:
#include
#include
/*
这个程序用于测试识别输入数据的机制
*/
int main()
{
int a,b,c,d;
/*
两个格式控制符中间用空格分隔
*/
scanf("%d %d",&a,&b);
printf("a=%d,b=%d\n",a,b);
/*
两个格式控制符中间不分隔
*/
scanf("%d%d",&c,&d);
printf("c=%d,d=%d",c,d);
return 0;
}
结果1:
解析:
1.可以看到,scanf中的两个格式控制符中间留一个空格和不留的结果是一样的。
2.输入时两个数据间可以用空格,Tab键,Enter键隔开。
代码2:
#include
#include
/*
这个程序用于测试识别输入数据的机制
*/
int main()
{
int a,b,c,d;
/*
两个格式控制符中间用空格分隔
*/
scanf("%d and %d",&a,&b);
printf("a=%d,b=%d\n",a,b);
/*
两个格式控制符中间不分隔
*/
scanf("%d,%d",&c,&d);
printf("c=%d,d=%d",c,d);
return 0;
}
结果2:
解析:
1.当scanf语句中两个格式控制符用非空格的任何字符间隔时,输入时也必须用那个字符来隔开输入的数据。
2.当输入时出现错误,未被赋值的变量中将是随机的数。
不同数据类型的自然分割:
直接使用代码说明:
#include
#include
/*
这个程序用来测试C语言中输入数据自动分割的机制
*/
int main()
{
int a,b,c;
char op;
int i;
for(i=0;i<4;i++)
{
scanf("%d%c%d",&a,&op,&b);
if(op=='+')
{
c=a+b;
printf("会算%c,结果是:%d\n",op,c);
}
else
{
printf("不会算%c\n",op);
}
}
return 0;
}
结果:
解析:
1.当为前一个元素获取到了一个值之后,如果碰到下一个元素符合第二个格式控制符的要求,将直接结束第一个元素的获取并将第二个元素放入第二个变量。
2.注意,当输入3.14+3之后,输出的是不会算.而非会算+,或字符格式不正确!
数据缓存区基础概念:
代码:
#include
#include
/*
這個程序用來測試數據緩存區的存在
*/
int main()
{
int i;
for(i=0;i<4;i++)
{
int a,b,c;
scanf("%d",&a);
scanf("%d",&b);
scanf("%d",&c);
printf("%d %d %d\n",a,b,c);
}
return 0;
}
解析:
1.第一次输入时,每输入一个数,就使用回车键将数据赋给变量。第二次输入时,一次性输入3个数据,然后一起赋给变量。
2.两次输入都得到了正确的结果,但第二次输入时。程序的每个个scanf()语句都能拿到正确的值,说明在第一个scanf语句拿完值之后,输入的数据并没有被弃置。而是被暂时存入了一个数据缓存区,之后次需要用到标准输入给变量赋值时,就优先从缓存区中拿取数据。
指定宽度的输入:
代码:
#include
#include
/*
这个程序用来测试指定宽度的输入
*/
int main()
{
int a,b;
scanf("%2d%3d",&a,&b);
printf("%d %d\n",a,b);
return 0;
}
结果:
解析:
1.通过在格式控制符中加入数字,形成诸如:%2d,%3f.之类的指定宽度的格式控制符,可以使其一次性只从数据缓存区中拿取被指定的宽度的数据(缓存区剩余的数据会继续保存留待下次使用)。
1.当输入的是一个double型数据时,格式控制符必须使用%lf而非%f.
2.当用scanf 给指针变量赋值时,指针变量前不加取地址符(scanf("%d",p)而非scanf("%d",&p))因为p本身代表的就是变量的地址。
输出:
主要使用printf函数:
功能:用标准输出(一般是输出到显示器)输出信息。
格式:printf(格式描述串,[其他参数]);(如:int a=5; printf("%d",a);)
需求引用的库:stdio.h (这也是为什么几乎所有C语言程序的开头总是一句"#include
格式描述串:
转换描述 | 实现的转换 | 对应参数的类型 |
%d | 将参数按整数形式转换输出 | int |
%ld | 将参数按长整数形式转换输出 | long |
%f | 将参数按带小数点数形式转换输出 | double(不是float!) |
%Lf | 将参数按带小数点形式转换输出 | long double |
%c | 输出一个字符 | 表示字符的编码 |
注意:
1.格式描述串和格式控制符有很多共同点,但应明确的记住他们的区别!
2.%lf和%f虽然不是对应float型的,但可以用他们输出float型的变量(默认保留小数点后6位)。
3.格式描述串也能指定输出的宽度等格式,指定方式和格式控制符相同。(当输出浮点型时,%lf/%f中加入10.8代表总宽度10位,小数点后的数据占8位)
整型输出格式描述串扩展:
格式控制 | 实际输出形式 | 参数 |
%d , %i | 带符号的十进制形式整数 | int |
%o | 无符号八进制表示的整数,没有先导的0 | int |
%x , %X | 无符号十六进制整数,没有先导的0x或0X | int |
%u | 无符号十进制整数 | int |
测试代码:
#include
#include
/*
这个程序用来测试常用的输出整型的格式描述串
*/
int main()
{
printf("%d\n",1234);
printf("%6d\n",1234);
printf("%o\n",1234);
printf("%x\n",1234);
printf("%X\n",1234);
printf("%u\n",1234);
printf("%u\n",-1234);
return 0;
}
结果:
1.当用%6d输出1234时,可以看到1234前空了两格,这是因为输出格式要求宽度为6.而空出的两格中是用于填充的空格。(可以人为修改用其他符号或数据来代替空格进行填充工作,感兴趣可以自己去查找相关资料)
2.当用%u(无符号十进制)输出-1234时,输出的数明显过于巨大了。这是因为负整型用二进制存储在计算机中时,二进制的第一位是用于存储符号的。而当整数为负时,第一位就是1。而如果我们使用无符号整型输出这个二进制数,解析时就会把首位的1认为是数据的一部分而非符号表示位。所以得到的数会大的反常(如想详细了解,可以去搜索整型在计算机中的存储原理)
浮点型数输出格式描述串扩展:
格式控制 | 实际输出格式 | 参数 |
%f | 一般实数形式,用%m.n形式控制宽度与小数点后位数 | double |
%e , %E | 科学计数形式 | double |
%g , %G | 灵活形式(当指数小于-4或大于等于精度描述用%e或%E的形式输出,否则用%f的形式输出) | double |
测试代码:
#include
#include
/*
这个程序用来测试浮点型数据的格式描述串
*/
int main()
{
printf("%f\n",1234.56);
printf("%10.3f\n",1234.56);
printf("%e\n",1234.56);
printf("%E\n",1234.56);
printf("%G\n",1234.56);
printf("%g\n",1234567.56);
return 0;
}
输出:
解析:
无特异点,参照上方表格方面理解。
注意点:
1.如果输出时参数少于前方定义的格式描述串,缺少的部分会输出随机的数据。
2.如果输出时参数多于前方定义的格式描述串,多余的部分会被自动舍弃(但某些情况下可能会影响程序的运行,所以应该尽量避免这种情况)。
3.如果输出时参数数据类型和格式描述串不匹配,会输出奇怪的东西。