细心的同学可能昨天就注意到了,昨天那一讲的标题一开始是gets()&&getchar(),后来又很快的改了,因为昨天加班回来有些晚了,再讲getchar()确实是来不及了,所以,今天我们来看看这个getchar()和putchar()他们的功能是什么。
getchar(),就算大家是新接触C/C++的,我想经过这些天,大家已经对这个函数比较熟悉了,因为在前面的例子里,我会为了让控制台停住,所以在return之前添加了这个函数,当然有时候不是一个,而是连续用了几个才使得屏幕停住。
说到让屏幕停住,因为有时候需要用到很多的getchar(),所以为了方便,我用一个极为糟糕的方法,我原本以为会有人指出来,但可惜,都两三天了,还是没人指出这个糟糕之处。
当然,我不希望大家在编程的时候为了让控制台屏幕停住而是用死循环的思想,这虽然能够让屏幕停下来,但是这个点子糟糕透了。
在说getchar()之前,我们先来看另一个函数:system("PAUSE");这个函数声明于 stdlib.h头文件中,所以要使用这个函数就得在开头包含这个头文件:#include <stdlib.h>。
还是从一个实例切入主题吧,我们还是以输入Hello World,然后再将其打印出来为例:
------------------------------------
#include <stdio.h>
#include <stdlib.h>
int main()
{
char ch;
printf("请输入一个字符串:\n");
ch = getchar();
printf("%c.\n",ch);
system("PAUSE");
return 0;
}
-----------------------------------
聪明的大家是不是发现了问题的所在,这个程序不可能会按照我们的想法来实现,为了证明大家是对的,我们来验证一下吧:
大家是不是想,切,这还没scanf()有用呢,scanf()好歹还能输出一个Hello,这个却只能输出一个H,是啊,getchar()自己也觉得好冤枉,他会想我明明写了只能读取字符,是你们太让我为难了。
虽然getchar()只读取一个字符,但是他有一点是scanf()比不了的,他不但能够读取字符,还能读取任意标点符号,如果处理得好,就可以连续输出,不过,在实现这个功能之前,我们不妨先来看看getchar()的原型到底是什么样,以便好使用他:
int getchar(void);
从这个原型可以看出,这个函数不需要参数,他直接把键盘的输入直接拦截下来,储存在相应的变量中(本例中是ch),但是大家是不是觉得奇怪,为什么他的返回值是个int呢?嗯!前面的章节里好像已经说过这么一句话,C/C++的世界里要学会见怪不怪,他既然返回值是个int,我们不妨把ch改成int,看看他返回的到底是什么:
------------------------------------
#include <stdio.h>
#include <stdlib.h>
int main()
{
int ch;
printf("请输入一个字符串:\n");
ch = getchar();
putchar(ch);
putchar('\n');
system("PAUSE");
return 0;
}
-----------------------------------
现在我们没有用scanf(),也没用printf(),而是纯粹的用了getchar()和putchar(),现在我们再来看看输出有什么变化:
看来我们将char换成int没有对他造成影响,这是为什么呢?如果是零基础的可能真不知道,但是如果大家对C/C++多少有些认识的话就不会不知道为什么了,因为char也是整形,所以用int和char对getchar()来说都没有区别,那大家是不是有迷惑了呢?为什么明明返回的是个整形,为什么输出一个字符型呢?这就是这个函数的特点了,顺便提一下,正确的定义数据类型用的就是int,只是大家为了明确一些,就用char,所以如果大家看别人源码遇到用int的不要觉得奇怪。
好像又跑题了,我们不是要用getchar()来实现怎么输入字符串吗?其实我一直在犹豫,我不知道是不是在这个时候和大家讨论这个问题,因为这里会用一个while()循环,但是关于循环我还没给大家说,现在突然说起,对于新人来说,可能有些突兀了。但是想了想,虽然没有真正的接触到while,但是大家应该对这个函数不陌生,上面我还在说我前两天用了一个很糟糕的方法来让控制台停住,所用的就是while,还记得吗?
---------------------
while(1)
;
---------------------
这个函数什么也没做,他就在那里一遍遍的循环,所以原本会退出的程序就这样被耗在哪里了,既然已经说到了这里,就借此机会说说以while()这个函数的使用,while()的形式像这样:
-------------------------
while(condition)
{
do something;
}
--------------------------
括号里的条件是我们自己给定的,所以这个函数可以这么来解读:当满足某某条件式,就做什么(something)。说到这里大家是不是又对上面的那个while(1)疑惑了?这里简单说一下,关于判断其实就是想要一个真假,当满足条件是为真,不满足自然为假,在C/C++里面有这么一个定义,非零为真,0为假,所以while(1)其实就是我们强制让为真。
说了上面这么多,目的是为了让getchar()能够读取字符串,我们来看看下面这个程序:
-----------------------------------
#include <stdio.h>
#include <stdlib.h>
int main()
{
int ch;
printf("请输入一个字符串:\n");
while((ch = getchar()) != '/n')
putchar(ch);
putchar('\n');
system("PAUSE");
return 0;
}
-----------------------------------
现在我们来看看是不是满足我们要求了:
非常完美,大家可以自己尝试一下其他的输入吧。getchar()就说到这里了,接下来我们来看看putchar()这个函数,记得昨天我好像说过,putchar()比printf()高,但是也只是空口无凭,今天我们来验证一下吧,我们分别用printf()和putchar()分别输出1万个字符,看他们所用的时间是多少,设计程序如下:
---------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
const int MAX = 10000;
int main()
{
char name[MAX];
long StartTime,EndTime,TimeForPrintf,TimeForPutchar;
for(int i=0;i<MAX;i++)
name[i] = 'a';
StartTime = clock();
for(int i=0;i<MAX;i++)
printf("%c ",name[i]);
EndTime = clock();
TimeForPrintf = EndTime - StartTime;
StartTime = clock();
for(int i=0;i<MAX;i++)
putchar(name[i]);
EndTime = clock();
TimeForPutchar = EndTime - StartTime;
putchar('\n');
printf("TimeForPrintf = %ld ms\n",TimeForPrintf);
printf("TimeForPutchar = %ld ms\n",TimeForPutchar);
system(“PAUSE");
}
-------------------------------------------
现在我们来看看,到底哪个函数的效率高一些:
嗯,好像putchar要快上几毫秒的样子。看来昨天我所说的应该没错,但是最后我还是想问大家一句,真的没错吗?一定没错吗?你们都亲自验证了吗?其实在我心里,这两个函数是平分秋色不分上下的,但是论应用层面,printf无疑是最广的同时能够是最强大的。
最后再说一下,对于printf和putchar来说,谁的执行速度快只是暂时的,当我们把输出的字符扩大到10万的时候,又是一番景象,大家可以尝试一下然后来把我昨天的结论推翻吧。
转自公众号: C/C++的编程教室