快速读写(fastio)与getchar()及putchar()
一、快读快写
在变写程序时,我们会发现:自带的 cin 、 cout 、 scanf 、 printf 有点慢,这时,我们就可以是用快读快写
以long long类型为例,代码如下:
1 //整数快读代码 2 long long read() { 3 long long x=0, f=1; 4 char ch=getchar(); 5 while((ch<'0')||(ch>'9')) { 6 if(ch=='-')f=-1; 7 ch=getchar(); 8 } 9 while(ch>='0'&&ch<='9') { 10 x=(x<<1)+(x<<3)+ch-'0';//x<<1等价于x*2,x<<3等价于x*8。 11 ch=getchar(); 12 } 13 return f*x;//f=-1时,表示读取的是负数 14 } 15 //可以这样使用 16 long long x; 17 x=read(); 18 //整数快写代码 19 void write(long long x) { 20 if(x<0) putchar('-'),x=-x; 21 if(x>9) write(x/10); 22 putchar(x%10+'0'); 23 } 24 //要输出一个整数 x,直接这样用: 25 write(x);
二、putchar()与getchar()
事实上,
以上快读快写,依赖的就是putchar()与getchar()
getchar()的用法:
(a)语法:
1 int getchar(void);
(b)返回值:
getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键。
(c)作用:
从标准输入流只读取一个字符(包括空格、回车、tab),读到回车符('\n')时退出,键盘输入的字符都存到缓冲区内,一旦键入回车,getchar就进入缓冲区读取字符,一次只返回第一个字符作为getchar函数的值,如果有循环或足够多的getchar语句,就会依次读出缓冲区内的所有字符直到'\n'.要理解这一点,之所以你输入的一系列字符被依次读出来,是因为循环的作用使得反复利用getchar在缓冲区里读取字符,而不是getchar可以读取多个字符,事实上getchar每次只能读取一个字符.如果需要取消'\n'的影响,可以用getchar()来清除,如:while((c=getchar())!='\n'),这里getchar();只是取得了'\n'但是并没有赋给任何字符变量,所以不会有影响,相当于清除了这个字符。例:
1 #include<cstdio> 2 int main() { 3 char a,b; 4 a=getchar(); 5 b=getchar(); 6 putchar(a); 7 putchar(b); 8 return 0; 9 }
putchar()的用法:
(1)输出:putchar函数只能用于单个字符的输出,向终端输出一个字符,且一次只能输出一个字符。
(2)格式:对于变量来说,格式为:
putchar(ch);
对于常量来说,格式为
putchar('c');
对于转义字符来说,格式为:
putchar('\0');
注:本篇转自作者的另一篇博客。