关于C语言中scanf()和getchar()的一点总结和对国内C教材的一点吐槽

最近重新学习C语言,建议大家看看篇帖子

http://tieba.baidu.com/p/2843103544?traceid=

建议广大学生拿到国内的计算教材的第一时间就把它rjljt......自己领会。

下面是关于重新学习scanf()和getchar()的一点总结

关于这点我也要吐槽一下,看了国内那么多帖子,发现不是讲的逻辑乱不全,要不然就是还有错的,而且很多不知道

是不是受国内教材毒害太深,很多逻辑也有问题。好了话不多直接开始吧。我这里引用了不少人的例子但是太多可能自己都不记得是那几篇博客的,如果有引用到请在评论中声明我会更改或如果你同意的化我会转载

https://blog.csdn.net/zqixiao_09/article/details/50189477  转载的一段话

输入操作的原理, 程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中 取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入,这就是例子 中为什么会出现输入语句失效的原因!
   

scanf()以Space、Enter、Tab结束一次输入,会舍弃最后的回车符(即回车符会残留在缓冲区中);

我认为这句话应该分成三种情况来说明,

首先是在读取十进制(也就是int型之类,scanf可以指定输入的类型)

在从缓冲区读取时,如果遇到Space、Enter、Tab就会结束这次读取,但是如果你一次输入时带有空格之类的类型,那么

下一的是scanf就是直接从缓冲区读取(而不是从键盘终端读取),但是注意此时的读取是会舍弃掉Space、Enter、Tab这些的

直接读取空格之后的(到下一个1结束输入符之前)

  int a,b;
  scanf("%d",&a);
  printf("%d\n",a);
  scanf("%d",&b);
  printf("%d\n",b);
  return 0;

测试

12 13

输出结果
12
13

还有一种情况说明就是会舍弃最后的一个回车符,也就是多次输入的最后一个回车符会残留在缓冲区

 

第二中要说明的是读取字符串的情况

scanf()在读取字符串时也是

遇到Space、Enter、Tab就会结束这次读取,但是如果你一次输入时带有空格之类的类型,那么

下一的是scanf就是直接从缓冲区读取(而不是从键盘终端读取),但是注意此时的读取是会舍弃掉Space、Enter、Tab这些的

直接读取空格之后的(到下一个1结束输入符之前)

  char str1[20], str2[20];
  scanf("%s",str1);
  printf("%s\n",str1);
  scanf("%s",str2);
  printf("%s\n",str2);
  return 0;

测试结果

Hello world
Hello
world

可以看出直接读取输入被分开

第三种就是对字符的读取

scanf()在对字符的读取时也是遇到Space、Enter、Tab就会结束这次读取,但是请注意此时的Space、Enter、Tab是会被下一次读取时读取的,当然最后一个Enter还是会被舍弃

char ch;
     while (true)
     {
         scanf("%c", &ch);

         switch(ch)
         {
             case '1':
                 printf("haha\n");
                 break;
             case '2':
                 printf("cccccc\n");
//                fflush(stdin);    //清除缓冲区
                 break;
             case '3':
                 printf("555\n");
                 break;
             case '\n':
                 printf("666\n");
             case ' ':
                 printf("777\n");
         
         }
     }

输入123
haha
cccccc
555
666
777
输入123 12
haha
cccccc
555
777
haha
cccccc
666
777

从上面的结果可看出

 

 

getchar()以Enter结束输入,也会舍弃最后的Enter;

同时getchar只能用于字符的输入读取,getchar与scanf在字符读取的不同在于getchar接受空格符,当然同时在下次读取时同样也读取Enter,舍弃最后一个Enter


 

     char a,b,c,d;
     a=getchar();
     b=getchar();
     c=getchar();
     d=getchar();
     putchar(a);
     printf("\n");
     printf("%d\n",a);
     putchar(b);
     printf("%d\n",b);
     putchar(c);
     printf("%d\n",c);
     putchar(d);
     printf("\n");
     printf("%d",d);

输入1
 输入空格4
1
49

10
 32
4
52
从以上结果可看出

 

从以上的结果和例子可以很直观的明白两者的区别,但是就是这么一个个小小的区别花了我一个下午和翻阅了

十几遍博客一遍遍实验,到底是C太难还是国内教材太垃圾受的毒害太深,特此谨记

你可能感兴趣的:(关于C语言中scanf()和getchar()的一点总结和对国内C教材的一点吐槽)