同时使用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语言 – 快速排序算法

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

  2. 关于指针的一些问题

    int a,*p=&a; printf("&a---%d\np---%d\n&p--- […]...

  3. C++语言——顺序表实现,用动态数组的方法

    C++语言——顺序表实现,用动态数组的方法 C++ 中常用的一些东西,通过使用动态数组 […]...

  4. 曾经我认为C语言就是个弟弟

    本文所有代码,均上传至github,如果你想直接看源代码,请到github下载,下载地址:https://gi […]...

  5. sizeof关键字

    sizeof关键字 sizeof不是函数,所以不需要包含任何头文件,它的功能是计算一个数据类型的大小,单位为字 […]...

  6. 数据结构 队列_队列的实现与分析

    结构Queue是队列的数据结构。同栈一样,也用typedef List Queue 来定义。  queue_i […]...

  7. 二维数组和指针

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

  8. 【C语言】第5章 循环结构程序设计

    第5章 循环结构程序设计 三种基本循环控制结构 使用while语句实现循环 先判断条件表达式,后执行循环体语句 […]...

随机推荐

  1. 软件工程第一次作业(WC)

    Github项目地址:https://github.com/3116005131/3116005131.git […]...

  2. Deep Unfolding Network for Image Super-Resolution 论文解读

    USRNet 的论文解读 Introduction 超分是一个在 low level CV 领域中经典的病态问 […]...

  3. java中的枚举类

    简单总结下Java枚举的用法,因为发现有的工程师还是喜欢用的。 原理 枚举类中得枚举项都会被编译成static […]...

  4. Finance_finacial_engineering_02

        第一章 金融衍生产品概率 1.1. 金融衍生产品概率 衍生品是一种金融合约,其价值取决于一种或多种基础 […]...

  5. iOS开发tip-图片方向

    相信稍微接触过iOS图片相关操作的同学都遇到过图片旋转的问题,另外使用[AVFoundation](https […]...

  6. grafana + influxdb + telegraf , 构建性能监控平台

      1.安装平台     1).grafana , 访问各类数据源 , 自定义报表、显示图表等等 , 用于提供 […]...

  7. 【深度学习】迁移学习Transfer Learning

            我们通常是拿到一个任务,譬如图像分类、识别等,搜集好数据后就开始直接用模型进行训练,但是现实情 […]...

  8. asp.net core系列 46 Identity介绍

    asp.net core系列 46 Identity介绍 一. Identity 介绍   ASP.NET C […]...

展开目录

目录导航