scanf与getchar()区别

今天再看getchar()函数,发现与scanf函数的知识混淆了,查找资料得出下面信息。

字符数据的输入:

  scanf()函数是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量中。

  在scanf()语句的格式串中由于没有非格式字符在“%d%d%d”之间作为输入时的间隔,因此在输入时要用一个以上的空格或回车符作为每两个输入数之间的间隔

  scanf()在读取数字时会跳过空格、制表符和换行符!

看下面的程序。

复制代码
1 #include<stdio.h>
2 int main()
3 {
4     int a,b,c;
5     scanf("%d%d%d",&a,&b,&c);
6     printf("%d%d%d",a,b,c);
7 }
复制代码

得输入1 2 3用空格来作为分隔。

  getchar()函数是键盘输入函数,其功能是从键盘上输入一个字符。简单来说就是getchar()函数在C程序中的功能是接收一个字符

首先看下面scanf()的程序:

复制代码
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 int main(void)
 4 {
 5     int a,b,c;
 6     printf("please input num a:\n");
 7     scanf("%d",&a);
 8     printf("please input num b:\n");
 9     scanf("%d",&b);
10     printf("please input num c:\n");
11     scanf("%d",&c);
12     printf("%d,%d,%d",a,b,c);
13 }
复制代码

运行结果:

再看下面char的程序:

 

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
char a,b,c;
printf("please input num a:\n");
scanf("%c",&a);
printf("please input num b:\n");
scanf("%c",&b);
printf("please input num c:\n");
scanf("%c",&c);
printf("%c,%c,%c",a,b,c);
}

运行结果:

为什么会这样子呢?为什么到了num b的时候输入不了呢?难道?

我们再来看一下源代码:

程序连续接收了三个字符,在C中enter键代表一个换行符,所以当输入完a的值‘q’之后按下enter键,换行符立马被字符b接收了,然后程序再向下走,输入c的值‘w’。结果就会按顺序显示a,b,c的值,我们已经知道a='q',b='\n',c='w';所以结果就会显示两行。

最后看下面getchar()程序:

复制代码
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 int main(void)
 4 {
 5     char a,b,c;
 6     printf("please input num a:\n");
 7     scanf("%c",&a);
 8     getchar();
 9     printf("please input num b:\n");
10     scanf("%c",&b);
11     getchar();
12     printf("please input num c:\n");
13     scanf("%c",&c);
14     printf("%c,%c,%c",a,b,c);
15 }
复制代码

运行结果:

最后最后看下面的程序:

复制代码
1 #include <stdio.h>
2 int main()
3 {
4     char a,b;
5     a=getchar();
6     b=getchar();
7     putchar(a);
8     putchar(b);
9 }
复制代码

我们输入x-回车-y-回车
  结果会是xy吗?不是的 结果是a=x b='\n'(回车)
  当我们开始打x的时候,x在缓冲区,当我们按下回车的时候,第一个getchar()才获取到x这个值 顺利存到a里 但回车既是确定又是字符,回车'\n'它也跟着进了缓冲区,并且和x一起被释放,x到了程序里 回车('\n')也到了程序里,并且被第2个 getchar()获取,此时我们输入y,这时缓冲区里有一个字符 'y', 然后我们又按下回车,'y'和'\n'又一起准备被释放,由于程序里没有第3个getchar(),所以'y'和'\n'还留在缓冲区,但它们两个已经是在准备状态中,如果程序又出现一个getchar(),'y'不需要你按回车它会直接进入到第3个getchar(),getchar()是依次获取,按先后顺序,不会先获取'\n',而'\n'正等待着马上进入第4个getchar()

#include<stdio.h>
int main()
{
    char s[10];
    char t;
    scanf("%c",&t);
    gets(s);
    printf("%c\n%s",t,s); 
}

gets可以读取空回车,但是scanf不能。当用gets进行读取时,它遇到第一个’\n’,就找到了它的输入分隔符,停止继续输入。

所以这里输入m在回车只会显示m

如果输入像这样

gets(str1);

getchar();

gets(str2);输入abc回车def的话,会显示abcef因为gets遇到回车(且gets可以读取回车)就停止了输入,getchar()吃掉了d

如果不加getchar就是正确的。

#include <stdio.h>
int main()
{
    char a,b;
    scanf("%c",&a);
    scanf("%c",&b);
    printf("%c %c",a,b); 
}

输入fe打印出f e;

输入f回车打印出f

原文地址:https://www.cnblogs.com/FettersLove/p/12862681.html