那么了解关于输入缓冲区的知识以后呢,我们就来看一下字符和字符串的输入
首先我们来看一下,当我们想从键盘上输入一个字符的时候
我们可以怎样处理。首先,大家非常非常熟悉的
我们可以直接用cin来完成这个输入。比方说这有一段程序,定义了一个字符
变量c,打印一行提示,要求你输入一个句子,然后呢,后面有这样一段程序,while
cin给c 也就是cout这个c,大家想象一下这个程序的执行会是怎样的一个过程啊
我提供两种选择。第一种选择是说,比方说我想输入ABC给这个程序
那我,当我从键盘上写一个a的时候
立刻程序就读到了这个a并且呢,在屏幕上立刻打印出这个a
然后我又敲入了一个b,那程序立刻就打印出一个b,然后我又敲入了一个c,那程序立刻打印出来一个c
这是一种运行方式。第二种运行方式是说:我在键盘上输入了abc
然后敲回车 这个时候,程序就会打印输出
abc。哪种方式?显然
第一种方式是错误的,如果你还是按照这种方式在想的话那么说明刚才输入缓冲区的这个概念
你把它忘记了,实际这个程序的执行方式肯定是这样的。就是说你不敲回车
这个数据是没办法送入输入缓冲区的
OK,那么知道了这一点就好办了。我们来看一下这个程序的执行结果,程序的执行结果是这样的
enter a sentence,打印输出,输入的是abc
然后空格,def,然后空格,g,然后呢,后面跟了一个回车
那么当我一敲这个回车的时候
程序就可以从缓冲区里头去读这一串的数字了,但是,在这我想说的是
对于cin这种输入方式而言
它在从输入缓冲区里读取数据的时候 它会把所有的空格和回车
都当做输入数据之间的间隔符
也就是它会把这个空格和回车都看做只是用来区分
不同数据的。我认为这些东西只是用来间隔不同的数据的
我不认为它是数据,于是呢,我在读取这些数据的时候,从这个输入缓冲区读取数据的时候
我不会把空格和回车当做数据读入进来
你比方说这个程序的输出,输出里头abcdefg
已经找不到所有的空格了,而且呢,输出完了以后它也没有把光标的位置放到下面来
没有把这个光标的位置放下来,说明在程序输出的最后它也没有输出
回车。所以你一定要记得,对于cin它这个东西,
它会跳过空格并且跳过回车
跳过空格跳过回车。
那有的同学可能问了,既然在这里呀,回车呀
空格呀,都被字符输入数据的间隔了
那我怎么终止这个输入呢。其实,当你想要终止一个输入的时候
你只要在后面敲一个这个东西
那么输入就被终止了,这是一个输入结束标志
别看好像是两个字符,其实这是一个字符。这个字符怎么输入呢?你只要摁住键盘上的control
然后摁一下Z这个字母就可以了 那么遇到这样一个标志的时候,那么cin的输入也就结束了
这是用cin来读取一个字符,那么除了这种方式之外还有什么方式可以读取一个字符呢? 我们再来看一下
那么除了这种方式之外,你还可以用cin.get这个函数来读取一个字符
有的同学可能问了,这个函数名里头怎么还有一个点啊,稍作一个解释
这个函数是cin这个对象的一个方法
所以说这个地方会有一个点。你可以把它理解为cin里面的一个函数
然后这样来调用。当然,具体的东西以后你们学到面向对象的时候这个事情就清楚了
在这呢你只要记住把它当做一个函数来用就可以了
那么这个函数呢还有两种形式,一种形式呢是cin.get,这里边括号里边什么都不写
另一种是说,在这里面写一个变量,这个变量的类型是char类型的
下面我们用两个例子来看一下他们分别是怎么来用的
第一个,我们先来看一下cin.get 定义一个字符,然后呢打印一个提示
然后c=cin.get,那这个东西怎么理解呢?
cin.get是一个函数,就像一个功能一样,你只要调用
你只要调用了一下这个功能,那它就会从缓冲区里边读一个字符把它付给c
这就是cin.get的含义。而且这还写了一个表达式。如果
赋值的部分。这个赋值表达式的值
不等于,EOF。EOF叫做文件结束标志
end of file。其实它的含义就是输入的结束。也就是说
如果函数给c赋的这个值 不等于end of
file的时候 我就一直读取下去,这个while循环就是一直进行下去
否则我就可以跳出这个while循环,终止这个程序
跟刚才的这个程序非常非常像,我们来看一下这个程序的执行结果
来看一下。我从键盘上呢,输入了这样一行字符
abc空格,def空格,然后g,g后面呢敲入了一回车
当我敲完了这个之后,这一串字符就被送到了缓冲区里头
然后呢,cin.get这样的一个函数,就从缓冲区里头,去读取这行字符
那只要读到了一个字符,我就把这个字符打印出来,只要读到这个字符我就把它打印出来
我们可以看到啊,这个输出结果跟刚才我们用cin来输入数据的结果是不同的
你看在这里,它把所有的空格
全部都按照字符给输出出来了
其实啊,如果你运行这个程序的时候你会发现。它输完了这个话以后,程序的光标是在这闪烁的
也就是说,它还输出了一个回车 这也就是说,它能把
空格和回车
都当做字符给读取进来,并且把它给打印出来
也就是说,这种输入方式,跟cin最大的不同就在于
它不会跳过空格,也不会跳过回车
它会把空格和回车都当做
字符给读入进来,都当做普通字符去看待
这是用这种方式来输入的时候
的一个特点。
那有的同学还又问了。那我怎么结束呢?程序结束的方式跟上一个程序一样
我只要输入一个输入终止符号,我就可以结束这个程序了
这也是一个字符,当cin.get读到这样一个符号的时候,它就结束
我可以直接就用cin.get读取一个字符的情况
我们可以看到这种方式比cin要强大一些了,但有的同学可能说你这个表达式写起来太费劲了,一不小心就写错了
怎么办呢?没问题,你可以使用带参数的
这个程序就简单多了。看看,我们用cin.get(char)
这样的方式来读入一个字符,看看怎么去做的
定义一个字符变量,输出一行提示,然后while语句里头cin.get(c)
get(c), cin.get(c)。那么get(c)的含义实际上就相当于
从键盘上读入一个字符并且把它赋值给c。
直接赋值给c,我们就不用判断了
而且呢,如果我读入的是错误的时候,cin.get这个函数返回一个0
返回一个假。如果读入的是正确的,就像cin一样
返回一个真。于是我们可以把它跟while语句放到一起使用
那么在这也一样,对于我读到的每一个字符,把它打印出来
把这个程序打印出来,我们来看一下它的运行结果。它的运行结果跟上一个
cin.get没有参数的这个情况是完全一样的。你看,当我从键盘上输入abc空格
def空格,g回车的时候。它会打印出来abc空格,def空格,g
也有一个回车,因为光标会在这闪烁。OK,而且呢
当我输入一个输入结束标志的时候,那么整个程序就结束了。也就是说它会把空格
回车,都当做普通字符来处理
什么东西是非普通字符啊?只有这个结束标志是一个非普通字符
这是这种方式 我们可以看到,总之用cin.get这种方式呢,就比cin,单纯用cin要强大一些
因为它会把空格和回车都当做字符来读取进来 那有的同学可能问了,有没有更强大的?
有。那么还有一个函数,它甚至,能把输入结束标志
都当做数据给读取进来。我们来看一下这个
我们来看一下这个程序。在这个程序里头,仍然定义了一个变量c
然后呢,我用了这样一个函数,等于getchar,getchar
那么在这样一个函数前头不用写cin. 但是它仍然是输入输出库里边的函数
对于这样一个函数,它就会不跳过任何字符。我们来看它的输出
我们输入一个abc空格,然后def空格,g回车
它会输出abc空格,def空格,g回车
于是光标在这闪烁。如果我再回车然后敲入一个control Z
这个时候呢,它就会把control Z 直接也,当做一个字符给
读取进来,并且打印出来。如果你再次键入control Z的话它还会把它打印出来
就是不跳过任何字符
我可以用这种方式来实现连续的输入。OK,那么我们在写程序的过程中呢
这几种方式你都可以去使用
并不是说不跳过任何字符的方法就比以前的方法要好。no,要根据你自己的情况
来选择处理,ok这是关于一个字符的输入