C语言中getchar与scanf函数详解

getchar函数概况

我们知道getchar函数是用来读取字符的一个函数。一般与putchar(输出字符)一起使用。

下面我们来看一下getchar在MSDN上的描述。

MSDN上说getchar这个函数的返回类型是 int ,就会有人产生疑惑了,getchar读取的不是字符嘛?怎么返回了整型?这就涉及到两点:

1.返回的int是指字符的ASCII码值,所以是int类型。

2.

MSDN上说,当getchar读取失败或者是读取文件结束时,会返回一个EOF。EOF也就是End Of File,即文件结束标志,它的值为-1 。所以getchar读取失败或者是读取文件结束时,返回值为-1

下面来看实例:

具体实例一:

C语言中getchar与scanf函数详解_第1张图片

在while循环中读取字符,我们想要让它停下来,需要给它一个停下的条件----就是这里的EOF,文件结束标志。

C语言中getchar与scanf函数详解_第2张图片

 在这输入Ctrl+Z就可以结束文件了。

具体实例二:

C语言中getchar与scanf函数详解_第3张图片

 这里可以看到,我们还没有确认身份证号呢,就直接进入else了。这里就涉及到缓冲区问题了,我们画个图来具体看一下。

C语言中getchar与scanf函数详解_第4张图片

 getchar 和scanf函数一样,都不是直接从键盘上读取数据,而是从中间的过渡段(缓冲区)读取数据。

但是这里就存在一个问题了,我们要想进行下一步,都需要 ‘ 回车键 ’ 来操作。但是回车键也是一个字符啊,它是 \n ,那这里就相当于多输入了一个 \n ,因此就会出现上述问题。还是画图来看:

 我们再键盘上输入123456\n,scanf只会拿走\n之前的东西(后面会讲),于是 123456就被拿走了。

 C语言中getchar与scanf函数详解_第5张图片

 然后 char a=getchar()就将缓冲区的  \n  拿走了,于是,c中就是字符 \n

C语言中getchar与scanf函数详解_第6张图片

 解决措施

一、不用scanf函数读取字符串,而是使用gets( )

      C语言中getchar与scanf函数详解_第7张图片

 gets函数和getchar类似,也是get函数,它是读取字符串的。今天我们先不说。

二、

还是用scanf读取,但是加一个getchar( )

C语言中getchar与scanf函数详解_第8张图片

 既然缓冲区里多了一个\n,那我们就再用个getchar将它拿走就行了。

但是这时又会产生一个问题

新的问题

如果我们的密码中间有个 ‘空格 ’ 怎么办?比如:123456 78

来看看具体情况:

C语言中getchar与scanf函数详解_第9张图片

 果不其然,错误来了。scanf函数只读取了 空格 前面的123456,而78和\n落在缓冲区了。C语言中getchar与scanf函数详解_第10张图片

解决方法

C语言中getchar与scanf函数详解_第11张图片

 用循环结构将缓冲区里的东西全部拿走(包括\n),并在循环中执行空语句。

相信到这getchar大家也都差不多清楚了,下面我们再来看scanf,有了getchar的基础,要说起来就方便多了。

scanf函数

我们不研究的太深,只说一下一些注意点。

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( ) ) )

今天的分享就到这里了,谢谢大家,如果觉得不错的话还请给个关注哈!

你可能感兴趣的:(c语言,青少年编程,visual,studio)