我们知道getchar函数是用来读取字符的一个函数。一般与putchar(输出字符)一起使用。
下面我们来看一下getchar在MSDN上的描述。
MSDN上说getchar这个函数的返回类型是 int ,就会有人产生疑惑了,getchar读取的不是字符嘛?怎么返回了整型?这就涉及到两点:
1.返回的int是指字符的ASCII码值,所以是int类型。
MSDN上说,当getchar读取失败或者是读取文件结束时,会返回一个EOF。EOF也就是End Of File,即文件结束标志,它的值为-1 。所以getchar读取失败或者是读取文件结束时,返回值为-1
下面来看实例:
在while循环中读取字符,我们想要让它停下来,需要给它一个停下的条件----就是这里的EOF,文件结束标志。
在这输入Ctrl+Z就可以结束文件了。
这里可以看到,我们还没有确认身份证号呢,就直接进入else了。这里就涉及到缓冲区问题了,我们画个图来具体看一下。
getchar 和scanf函数一样,都不是直接从键盘上读取数据,而是从中间的过渡段(缓冲区)读取数据。
但是这里就存在一个问题了,我们要想进行下一步,都需要 ‘ 回车键 ’ 来操作。但是回车键也是一个字符啊,它是 \n ,那这里就相当于多输入了一个 \n ,因此就会出现上述问题。还是画图来看:
我们再键盘上输入123456\n,scanf只会拿走\n之前的东西(后面会讲),于是 123456就被拿走了。
然后 char a=getchar()就将缓冲区的 \n 拿走了,于是,c中就是字符 \n
一、不用scanf函数读取字符串,而是使用gets( )
gets函数和getchar类似,也是get函数,它是读取字符串的。今天我们先不说。
二、
还是用scanf读取,但是加一个getchar( )
既然缓冲区里多了一个\n,那我们就再用个getchar将它拿走就行了。
但是这时又会产生一个问题
如果我们的密码中间有个 ‘空格 ’ 怎么办?比如:123456 78
来看看具体情况:
果不其然,错误来了。scanf函数只读取了 空格 前面的123456,而78和\n落在缓冲区了。
用循环结构将缓冲区里的东西全部拿走(包括\n),并在循环中执行空语句。
相信到这getchar大家也都差不多清楚了,下面我们再来看scanf,有了getchar的基础,要说起来就方便多了。
我们不研究的太深,只说一下一些注意点。
1.scanf读取字符串时只会读取 \n 和 ‘ 空格 ’之前的数据。
2.scanf(" %s",a), %前面的空格是scanf跳过输入的字符串里的空白字符。
然后再说一下多组输入
很多小伙伴在OJ平台(例如牛客网)刷题时,经常会碰到多组输入的情况,这边我就来说一下怎样多组输入。
一、首先是多组输入整数、浮点数
以浮点数为例吧,格式为:
double i=0;
while(scanf(" %lf " ,&i) !=EOF){
}
或是:
double i=0;
while( ~scanf(" %lf " ,&i) ) {
}
上面的 !=EOF 大家可能已经了解了,我再说一下下面的一段代码 ~
首先要知道 ~ 是按位取反操作符,它是强制将一个数的二进制位取反。
其实~scanf(" %lf " ,&i) 与 scanf(" %lf " ,&i) !=EOF 效果一样
EOF值为-1,在二进制中原码是10000000 00000000 00000000 00000001
反码是111111111 111111111 111111111 111111110
补码是111111111 111111111 111111111 111111111
~ 按位取反后即为00000000 0000000 0000000 00000000 值为0
所以while(0)为假,跳出循环,等同于EOF的作用。
二、多组输入字符
char ch;
while ( scanf (" %c" ,ch)!=EOF) 或 while ( ~ scanf (" %c" ,ch) )
while ( (ch=getchar( ) ) !=EOF ) 或 while (~(ch=getchar( ) ) )
今天的分享就到这里了,谢谢大家,如果觉得不错的话还请给个关注哈!