C用于输入输出的函数有2组,分别为字符输入输出(getchar,putchar),格式化输入输出(scanf,printf)。
C++则多一组流输入输出(cin,cout)。
stdio.h是C的标准I/O库,是以函数的方式向buffer(缓冲区)写入或读取字符。
iostream是C++的标准I/O库,引入了输入/输出流的概念,是一个类库,是以类方法从streambuf中读取,写入字符。
一、单个字符输入输出
调用库(C++)或<stdio.h>(C语言)
(一)getchar()
用于输入字符,常为把输入的字符赋予一个字符变量。
一个getchar()只能接受一个字符,输入多个也按照单个处理;唯一可以接受空格和回车的输入;其等待用户的输入,可用于暂停程序直到按下回车键。没有参数,函数值为从输入设备接受的字符。
若有不止一个getchar(),应在一次性输入所有字符之后再按回车,否则回车会被当做字符读入。
(二)putchar()
作用是输出单个字符。
二者格式如下。
#include<cstdio>
using namespace std;
int main(){
char ch;//定义字符变量ch,未赋值
char c='B';//定义字符c,赋值为字符'B'
ch=getchar();//输入ch
putchar(c);//输出c
putchar(ch);//输出ch
putchar('\x42');//用转义字符输出字符'B'
putchar(0x42);//16进制ASCII码输出字符'B'
putchar(66);//10进制ASCII码输出字符'B'
}
实例:大小写英文字母转换,并输出转换后字母的ASCII码值
#include<stdio.h>
char ch;
int main(){
ch=getchar();
ch+=32;
putchar(ch);
return 0;
}
/*Input:B
Output:b
*/
二、scanf和printf
调用库或<stdio.h>
高能预警。
这是一对敲字最慢但是程序效果最好的输入输出。
格式控制符必须用双引号""括起来,普通字符是输出时原样输出的字符。
\n’是换行符,用于换行,可添加在格式控制符之后。
scanf格式
scanf(格式控制字符串, 地址表列);
scanf("%d,%f", &a, &b);
//非格式字符输入数据以,分隔,也可以是空格、Tab、回车
printf中,格式符之间可添加字符串。
#include<cstdio>
using namespace std;
int a,b,c,d,e;
char f,g,h,i;
long long j;
short k;
int l,m,n,o;
int main(){
//以下代码仅展示格式符使用方式,后半部分scanf和printf使用的长得一样的格式符并非完全对应。
scanf("%d",&a);//%d用于int型变量的输入,&表示“取地址”。
scanf("%i",&b);//同上
scanf("%u",&c);//u用于无符号十进制形式输入十进制整数
scanf("%o",&d);//o用于输入八进制整数
scanf("%x",&e);//x用于输入十六进制整数
scanf("%c",&f);//c用于输入单个字符
scanf("%s",&g);//s用于输入字符串(非空格开始,空格结束。字符串变量以'\0'结尾
scanf("%f",&h);//f用于输入实数。
scanf("%e",&i);//同上
//以下为附加格式符
scanf("%ld",&j);//长整型数("%ld" "%lo" "%lx"),double型数("%lf" "%le")
scanf("%hd",&k);//h用于短整型数("%hd" "%ho" "%hx")
scanf("%*d%d%d",&l,&m);//*表示对应的输入不赋给变量
scanf("%3d",&n,&o);//加在这里的整数表示控制域宽
//开始输出。
printf("%d\n",&a);//d与i都是以带符号形式输出十进制整数,整数的正号省略。
printf("%i\n",&b);
printf("%u\n",&c);//u用于无符号十进制形式输出十进制整数
printf("%o\n",&d);//o用于输出八进制整数,不输出前导符0
printf("%x\n",&e);//x(或者X)用于输出十六进制整数,不输出前导符0x
printf("%c\n",&f);//c用于输出单个字符
printf("%s\n",&g);//s用于输出字符串
printf("%f\n",&h);//f用于小数形式输出单双精度,隐含6位小数,四舍五入。
printf("%e\n",&i);//e或E用于指数形式输出单双精度,隐含六位小数。
//以下为附加格式符
printf("%g\n",&j);//g或G输出时小数尾数没有多余的0
return 0;
}
C语言中printf(),scanf()函数的转换说明表(%百分号加字母),修饰符表和标记表
s针对的是C++中字符串类型。
实例:大小写英文字母转换,并输出转换后字母的ASCII码值
#include<stdio.h>
char ch;
int main(){
ch=getchar();
ch+=32;
printf("%c","%d\n",ch,ch);
return 0;
}
/*Input:B
Output:b,98
*/
常见错误
scanf("%d,%f\n",&a,&b);
scanf("%d,%f",a,b);
scnaf("%7.2f",&a);
三、流输入输出(C++)
调用库
(一)cin
自动识别变量类型。
格式如下:
cin>>变量;
cin>>变量1>>变量2>>变量3…;
(二)cout
格式为:
cout<<表达式;
cout<<表达式1<<表达式2<<表达式3…;
cout是不会自动换行的,必须手动输入换行符实现换行,有两种(目前不需要明确二者区别):
cout<<a<<‘\n’;
cout<<a<<endl;
endl稍慢,不过数据较小时不影响。
*注意:*数据规模达到10w时,cin和cout会跑不动。
输入时数据间用一个空格或回车分开。
浮点数控制小数点后位数:
#include<iostream>
#include<iomanip>//控制位数函数需要调用的库
using namespace std;
int main(){
double a;
cin>>a;
cout<<fixed<<setprecision(3)<<a;//格式如上,数字表示要保留的小数点数位数
return 0;
}
说明
- 注意库的调用
- cin,cout属于C++的概念,调用时涉及输入输出流;scanf和printf属于C语言的概念,是C语言的标准输入/ 输出库的函数,所以在时效上,scanf和printf优于cin和cout。对于大数据的输入输出,通常情况下应该用后者。
- 对于普通数据的输入输出,cin和cout比较方便,而在格式化方面,scanf和printf比较容易,cin效率比scanf低很多,尤其输入数据达到20w以上时非常明显,达到100w时cin输入就会超时。
- scanf和printf也有缺点,cin和cout能自动识别变量的数据类型,输入输出时不需要指定数据类型,前者不能,需要指定。