同时使用scanf()函数和getchar()函数的陷阱

CQWF 2018-08-17 原文

同时使用scanf()函数和getchar()函数的陷阱

函数名: scanf 
功 能: 执行格式化输入 
用 法: int scanf(char *format[,argument,…]);
scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。
函数名:getchar
功能:从计算机终端(一般是键盘)输入一个字符。
 
  同时使用者两个函数时,会有陷阱,代码如下:
  1. #include <stdio.h>  
  2.   
  3. int main(void)  
  4. {  
  5.     char buff[20],ch;  
  6.     int num,i=0;  
  7.     printf(“请输入一个数字:\n”);  
  8.     scanf(“%d”,&num);  
  9.     printf(“请输入一个字符串:\n”);  
  10.   
  11.     while((ch=getchar())!=‘\n’)  
  12.     {  
  13.         buff[i] = ch;  
  14.         i++;  
  15.     }  
  16.     buff[i] = ‘\0’;  

  运行如上代码:

  发现并没有给我们输入字符串的机会,直接跳过了11行的while,这就是同时使用这两个函数的陷阱,因为前面的scanf()在读取输入时会在缓冲区中留下一个字符’\n’,所以如果不在此加一个
getchar()把这个回车符取走的话,getchar()就不会等待从键盘键入字符,而是会直接取走这个“无用的”回车符,从而导致读取有误,要解决这个问题,就要防止在使用getchar()之前还有’\n’;处理方法是使用while(getchar()!=’\n’); 清除之前的回车;代码如下:

  1. #include <stdio.h>  
  2.   
  3. int main(void)  
  4. {  
  5.     char buff[20],ch;  
  6.     int num,i=0;  
  7.     printf(“请输入一个数字:\n”);  
  8.     scanf(“%d”,&num);  
  9.     printf(“请输入一个字符串:\n”);  
  10.     while(getchar()!=‘\n’);    
  11.     while((ch=getchar())!=‘\n’)  
  12.     {  
  13.         buff[i] = ch;  
  14.         i++;  
  15.     }  
  16.     buff[i] = ‘\0’;  
  17. }  

  

问题完美解决。其实用 if((ch=getchar())==’\n’);  也是可以的,只要从缓冲区读出有’\n’,就什么也不做,不要忘了有分号;

posted on 2018-08-17 21:11 九至尊 阅读() 评论() 编辑 收藏

 

 
版权声明:本文为CQWF原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/CQWF/p/9495309.html

同时使用scanf()函数和getchar()函数的陷阱的更多相关文章

  1. C语言之数据在内存中的存储

    C语言之数据在内存中的存储 C语言之数据在内存中的存储   C语言之数据在内存中的存储 在我们学习此之前,我们 […]...

  2. 关闭(隐藏)控制台上显示的文件路径

    昨天有个朋友问我,怎么关闭在运行程序后,控制台上显示的文件路径啊?啥??我突然不知道他说的说什么,然后我就自己 […]...

  3. 递归的存储以及执行顺序

    在函数的执行过程中无可避免的会涉及到参数存储的问题,而函数的参数是存储栈中,栈最大的特点是“先进后出”,之前创 […]...

  4. GDB调试指南-启动调试

    GDB调试指南-启动调试 前言 GDB(GNU Debugger)是UNIX及UNIX-like下的强大调试工 […]...

  5. C语言 – 快速排序算法

    1、 快速排序算法 1 #include<stdio.h> 2 3 struct node 4 { […]...

  6. [源创] STM32F103ZET6 基于XMODEM 通讯的 BOOTLOADER案列IAP

    网上好多初学者 都想知道如何更好的用IAP,BOOTLOADER 功能 我给大家一个我自己的基于Xmodem的 […]...

  7. c语言数字图像处理(五):空间滤波

     空间滤波原理 使用大小为m*n的滤波器对大小为M*N的图像进行线性空间滤波,将滤波器模板乘以图像中对应灰度值 […]...

  8. 二维数组和指针

    二维数组和指针,是一个比较难的地方,能力有限,也只能谈谈自己对此略微的认识,如有啰嗦口误之处,多多包涵!! 推 […]...

随机推荐

  1. iOS开发项目之一 [ 项目流程]

    项目流程     *人员配置         *客户端(iOS工程师,Android工程师)         […]...

  2. hive分桶表bucketed table分桶字段选择与个数确定

    为什么分桶 (1)获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具 […]...

  3. 《从Paxos到Zookeeper:分布式一致性原理与实践》第一章读书笔记

    《从Paxos到Zookeeper:分布式一致性原理与实践》第一章主要介绍了计算机系统从集中式向分布式系统演变 […]...

  4. [区块链] 密码学——椭圆曲线密码算法(ECC)

      今天在学椭圆曲线密码(Elliptic Curve Cryptography,ECC)算法,自己手里缺少介 […]...

  5. Spring Cloud 系列之 Netflix Eureka 注册中心(一)

    服务注册中心是服务实现服务化管理的核心组件,类似于目录服务的作用,主要用来存储服务信息,譬如提供者 url 串 […]...

  6. matlab在3维空间非x-y平面绘制直方图

      最近由于同学需要,要帮忙绘制一张matlab的三维空间的图,带有数据的二维分布。在网上找了很久,也没有找到 […]...

  7. super与this的用法

    分别解释关键字super与this的用法 This:this代表了当前对象的一个引用,可将其理解为对象的另一个 […]...

  8. MySQL实例crash的案例分析

    【问题描述】 我们生产环境有一组集群的多台MySQL服务器(MySQL 5.6.21),不定期的会crash, […]...

展开目录

目录导航