那些年我们半知半解的输入输出

输入输出

说到输入输出,就必须先说一下坑人(陶小朋友)的cin cout

使用cin,cout,要有

#include<iostream>
using namespace std;

初级篇
一:标准流输入函数cin
格式1:cin>>变量;
格式2:cin>>变量1>>变量2>>变量3…;

二:标准流输出函数cout
格式1:cout<<表达式;
格式2:cin>>表达式1>>表达式2>>表达式3…;

注意:前方小批蚊子来袭,请做好准备。
(为了防止引起某些人的蚊子恐惧症,我用白色字体。)


1:注意它不用带”&”的,也不用写明变量类型。显然也就不会检查变量输入是否合法。
2:如果在循环内部输入不合法的变量值,那么也将陷入死循环。若想要当输入不合法变量,就跳出循环,可以把cin>>i语句移到判断循环的语句中。
3:因为cin是以空格为分隔的,当你输入一个空格时,那他就认为后面的输入不属于这里了,认为应该给后面的变量了。另外,当你输入的字符串大于分配的空间时,还会出现溢出现象。当然,还有整行输入的函数,包括空格也一起输入了,这里就不说了。


中级篇
cin,cout虽然好用,但是相比scanf等,效率低下。
据说某同学(陶XX)就是用cin,cout,然后就TL了。后来改成scanf,printf就AC了。
于是某同学(宋XX)就给我说,加上一句

std::ios::sync_with_stdio(false); std::ios::sync_with_stdio(false); std::ios::sync_with_stdio(false);

就可以使cin,cout的速度和scanf,printf差不多。
In fact,cin,cout之所以速度慢,是因为要先把输入(输出)的东西存入缓冲区,再输入(输出),导致效率降低,而这条代码可以来打消iostream的输入输出缓存,可以节省许多时间,使效率与scanf与printf相差无几。
(关于cin,cout的更多用法,请看这里


下面是常用的
scanf printf
(不要问我流输入输出的高级篇去哪儿了)
废话就不说了,先感受一下scanf,printf的魅力吧。。。

注意:前方小批蚊子来袭,请做好准备。
(为了防止引起某些人的蚊子恐惧症,我用白色字体。)


- %d十进制带符号整数
- %o八进制无符号整数
- %x十六进制无符号整数
- %f十进制小数形式浮点数,无域宽时带6位小数
- %e十进制科学计数法形式浮点数
- %c单个字符
- %p指针的地址
scanf格式:scanf(“格式”,<地址>);
格式:% (标志字符)(域宽)格式化说明符
标志字符:*
(在读入之后,不将它赋给任何变量)
域宽:
实际位数多于域宽则截取域宽长度,剩余部分仍留在标准输入中等待下次输入;
实际位数少于域宽则无效果。
其它:
若不属于上面任何一种情况,则按格式进行对照忽略,即若%d与%d之间出现了“,”,输入将忽略紧夹在两个整数间的“,”,若整数间含有两个“,”,则在格式中需打两个“,”;不同的是,若为空格,也会进行忽略,但是会忽略掉中间的所有的空格或空行。当读入的整数、浮点数、字符串时无需在格式中加空格也可以自动忽略空格或空行。
地址:
需要读入参量的地址,不是变量本身
一般变量:变量名前加取地址符号“&”
字符数组:数组名就表示数组的首地址,无需加取地址符号
指针变量:指针名就是地址,无需加“*”
printf格式:printf(“<格式>”,<参量>);
格式:%(标志字符)(域宽)(精度)格式化说明符
标志字符:
-(结果左对齐,不够域宽时右边填空格)
+(不管正负号都输出符号)
#(输出%o时加八进制前缀0,输出%x时加十六进制前缀0x)
域宽:
实际位数多于域宽按实际位数输出(小数点等也算位数)实际位数少于域宽则在域宽内靠右,左边留空,若前有标志字符“-”则反之表示域宽的数字以0开头,则在实际位数少于域宽时靠右,左边补满前导零。
精度:
以“.”开头,后跟十进制整数对于浮点数,表示小数位数,实际位数更多,则四舍五入,更少则在后添零对于字符数组,表示长度,若实际长度更多,截取前一部分,更少无效果。
其它:
若不属于上面任何一种情况,包括出现未提及的字符,或者是未按照一定顺序,比如“空格”未直接跟在了“%”后面而是出现在了格式化说明符后,将按照原样输出参量:需要输出参量的值,不是地址。
参量:
一般变量:直接打变量名,前面不加取地址符号
字符数组:直接打数组名,告诉程序需要输出的开始位置
指针变量:在指针名前加指向标志“*”


下面是也很常用的
getchar putchar

#include<cstdio>
int main()
{
    char ch;
    ch=getchar();
    putchar(ch);
}
注意:前方小批蚊子来袭,请做好准备。
(为了防止引起某些人的蚊子恐惧症,我用白色字体。)


显然上面那段代码实现输入一个字符,并输出的作用。
getchar只能读入一个字符,遇到数字当作字符处理。
当用户敲下回车时,getchar才会结束。
若输入多个字符,getchar只会读入第一个字符。
若有两个及以上连续的getchar,应当一次性输入所需字符,最后再按回车,否则回车会作为一个字符传给后面的getchar()。

既然说到这里,就不得不说一下
输入输出优化

int in()
{
    int x=0;
    char c=getchar();
    while(c<'0'||c>'9')c=getchar();
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
}
void out(int x)
{
    if(x<10)putchar(x+'0');
    else write2(x/10),putchar(x%10+'0');
}

说道getchar就必须再说一下
getch getche
getch函数,当用户按下一个键后,程序直接往下执行,不会回显,也不会等到用户敲回车。
getche函数相比getch,除了要回显,就没什么区别了。
这两函数都是从C迁移过来的,在头文件#include< conio.h >下。
(某些整天万能头文件同学请注意,#include< bits/stdc++.h>不包含getch和getche函数)


下面是据说不被18级同学知道的
gets puts
puts()函数原型:int puts(char *string);
puts()函数用来向标准输出设备(屏幕)写字符串并换行。
puts(s)与printf(“%s\n”,s)作用相同
puts()函数只能输出字符串, 不能输出数值或进行格式变换。

gets()函数原型:char *gets(char *string);
gets()函数用来从标准输入设备(键盘)读取字符串直到回车结束, 但回车符不属于这个字符串。
gets(s)与scanf(“%s”, &s)作用相似
scanf(“%s”, &)遇到空格停止,gets()遇到换行才停止,
gets有风险,不建议使用。

顺便提一下
fgets fputs
fgets函数原型:char *fgets(char *s, int n, FILE *stream);
例如

#include<cstdio>
int main()
{
    char a[50];
    fgets(a,50,stdin);
}

(上述代码错误的风险交给读者承担,谢谢)
若n=50,实际上只能读取49个字符,最后一个用来存放‘\n’;
若实际读取量小于n-1,那么读到换行符停止,换行符也站一个空间。


fputs函数原型:int fputs(char *str, FILE *fp);
相比fgets函数去掉了中间的参数。

前生500次的回眸才换得今生的一次擦肩而过。 ”——《佛经》

这句话和这篇文章没有关系,我想说的是互联网上有千万亿万的文章,你能看到我这一篇,是多小的概率,你前生需要多少次的回眸呢?所以,感谢您使得我的浏览量++,顺手点个赞什么的吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值