C++中putchar与getchar函数的细节及运用
在C语言中,输入和输出除了用printf和scanf外,另外还有用于输入字符的函数为getchar()函数,用于输出字符的函数为putchar()函数。
功能解释如下:
下面用例子来说明函数的用法
#include <stdio.h> int main() { int ch = 0; while ((ch = getchar()) != EOF) putchar(ch); return 0; }
结果:
可以看出,当按下键盘上的回车键时,getchar函数会读取到屏幕中输入的字符和回车字符'\n',而putchar函数会将这个字符再次打印在屏幕上并显示出回车的效果。而当按下键盘上的ctrl+z键的时候,就会让getchar读取到EOF(意味着读取字符失败),此时getchar就会读取结束。
应用:
#include <stdio.h> int main() { char password[20] = { 0 }; printf("请输入密码:>\n"); scanf("%s", password); printf("请确认密码<Y/N>:"); int ch = getchar(); if (ch == 'Y') { printf("确认成功!"); } else { printf("确认失败!"); } return 0; }
整体上看并没有什么语法上的错误,但为什么会出现上面的情况呢?这里就要重点说明一下getchar函数的读取细节了。
如图:
首先scanf会把空格前的字符(即“12345”)都获取,此时缓冲区中就会剩下“ (空格)avcde”,而getchar函数就会将剩下的第一个字符读取,读取的第一个位“(空格)”,不为“Y”,所以显示“确认失败”;如何解决这一问题呢?就需要将剩下的字符都获取完(包括“\n”,原因是当在键盘上按下回车键时,系统就会默认输入一个“\n”),再输入后才会读取成功。
改进如下:
char password[20] = { 0 }; printf("请输入密码:>\n"); scanf("%s", password); printf("请确认密码<Y/N>:"); int tmp = 0; //巧妙的运用循环来清理缓冲区内的多个字符 while ((tmp = getchar()) != '\n')//当获取到'\n'时,循环结束 { ; } int ch = getchar(); if (ch == 'Y') { printf("确认成功!"); } else { printf("确认失败!"); }
此时就能按照正常的逻辑运行了。
以上就是对getchar函数一些小细节的理解,如有不当,欢迎指正!
到此这篇关于C++中putchar与getchar函数的细节及运用的文章就介绍到这了,更多相关putchar与getchar函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
相关推荐
-
C++实现二分法的一些细节(常用场景)
二分法是在一个排好序的序列(数组,链表等)中,不断收缩区间来进行目标值查找的一种算法,下面我们就来探究二分法使用的一些细节,以及常用的场景: 寻找一个数:寻找左侧边界:寻找右侧边界. 一.二分法的通用框架 int binarySearch(vector<int>& nums, int target){ int left=0, right=nums.size(); while(left < right) { int mid=(left+right)/2; if(nums[mid]
-
C++ main函数的几点细节
1.main()函数的标准原型 main函数是C++程序的入口函数,C++标准规定main()函数的返回值类型为int,返回值用于表示程序的退出状态,如果返回0则表示程序正常退出,如果返回非0,则表示出现异常.C++标准规定,main()函数原型有两种: int main(); int main(int argc,char* argv[]); //或 int main(int argc,char** argv); 当main()函数的返回值为int,而函数内没有出现return语句时,同样可以通
-
C++中const的实现细节介绍(C,C#同理)
1.什么是const? 常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的.(当然,我们可以偷梁换柱进行更新:) 2.为什么引入const? const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点. 3.cons有什么主要的作用? (1)可以定义const常量,具有不可变性. 例如: const int Max=100; int Array[Max]; (2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患.例如:
-
C++中需要注意的细节你知道吗
目录 namespace的使用 const使用: 引用 三目运算 函数相关 总结 namespace的使用 #include <iostream> using namespace std; //定义命名空间 namespace NameSpaceA { int a = 0; } namespace NameSpaceB { int a=1; namespace NameSpaceC { struct Teacher { /* data */ char name[10]; int age; };
-
C++函数返回值为对象时,构造析构函数的执行细节
看如下代码: 复制代码 代码如下: #include<iostream>class TestConstructor{public: TestConstructor() { std::cout<<"TestConstructor()"<<std::endl; } ~TestConstructor() { std::cout<<"~TestConstructor()"
-
C++中putchar与getchar函数的细节及运用
在C语言中,输入和输出除了用printf和scanf外,另外还有用于输入字符的函数为getchar()函数,用于输出字符的函数为putchar()函数. 功能解释如下: 下面用例子来说明函数的用法 #include <stdio.h> int main() { int ch = 0; while ((ch = getchar()) != EOF) putchar(ch); return 0; } 结果: 可以看出,当按下键盘上的回车键时,getchar函数会读取到屏幕中输入的字符和回车字符'\
-
C语言超详细讲解getchar函数的使用
目录 一.getchar 函数 二.缓冲区 1.什么是缓冲区 2.为什么要存在缓冲区 3.缓冲区的类型 4.缓冲区的刷新 三.getchar 函数的正确使用 1.getchar 的换行问题 2.getchar 与 scanf 的混合使用 一.getchar 函数 从上面的介绍来看,我们要正确使用getchar函数,首先得了解什么是缓冲区. 二.缓冲区 1.什么是缓冲区 缓冲区又称为缓存,它是内存空间的一部分. 也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部
-
java中的数学计算函数的总结
java中的数学计算函数 Math类: java.lang.Math类中包含基本的数字操作,如指数.对数.平方根和三角函数. java.math是一个包,提供用于执行任意精度整数(BigInteger)算法和任意精度小数(BigDecimal)算法的类. java.lang.Math类中包含E和PI两个静态常量,以及进行科学计算的类(static)方法,可以直接通过类名调用. public static final Double E = 2.7182818284590452354 public
-
PHP中addcslashes与stripcslashes函数用法分析
本文实例分析了PHP中addcslashes与stripcslashes函数用法.分享给大家供大家参考,具体如下: 在写一个网站的英文版时,写完后填加英文资料,我随便填写时一点问题没有,但每当填加指定的内容时却填加不上,也不报错,我查看了数据库,发现这个字段用的是"TEXT"数据数型,我以为是内容过长的原因,于是我把数据类型改成了"longtext",但提交时发现还是出现同样的问题.下面我们给大家介绍一下addcslashes函数吧! 后来请教同事,同事发现在是英文
-
深入解析C++编程中的纯虚函数和抽象类
C++纯虚函数详解 有时在基类中将某一成员函数定为虚函数,并不是基类本身的要求,而是考虑到派生类的需要,在基类中预留了一个函数名,具体功能留给派生类根据需要去定义. 纯虚函数是在声明虚函数时被"初始化"为0的函数.声明纯虚函数的一般形式是 virtual 函数类型 函数名 (参数表列) = 0; 关于纯虚函数需要注意的几点: 纯虚函数没有函数体: 最后面的"=0"并不表示函数返回值为0,它只起形式上的作用,告诉编译系统"这是纯虚函数"; 这是一个
-
详解C++中的内联函数和函数重载
内联函数(内嵌函数,内置函数) 调用函数时需要一定的时间和空间的开销.C++提供一种提高效率的方法,即在编译时将函数调用处用函数体替换,类似于C语言中的宏展开.这种在函数调用处直接嵌入函数体的函数称为内联函数(inline function),又称内嵌函数或内嵌函数. 指定内联函数的方法很简单,只需要在定义函数时增加 inline 关键字. 注意:是在函数定义时增加 inline 关键字,而不是在函数声明时.在函数声明时增加 inline 关键虽然没有错误,但是也没有任何效果 inline 关键
-
Java、C++中子类对父类函数覆盖的可访问性缩小的区别介绍
前言 "Java 和 C++ 中子类对父类函数覆盖的可访问性缩小的问题"的题目看起来比较学术化,但的确是一个容易忽视的问题.本文力求详细阐述这一问题在 Java 以及 C++ 中的区别. 先介绍什么是"子类对父类函数覆盖的可访问性缩小".对于继承而言,子类可以覆盖父类的"虚函数"--尽管 Java 中没有虚函数这一术语,但可以把 Java 的所有函数都看作虚函数,因为 Java 的所有函数都可以被子类覆盖.这里仅借用"虚函数"
-
JavaScript中变量提升和函数提升的详解
第一篇文章中提到了变量的提升,所以今天就来介绍一下变量提升和函数提升.这个知识点可谓是老生常谈了,不过其中有些细节方面博主很想借此机会,好好总结一下. 今天主要介绍以下几点: 1. 变量提升 2. 函数提升 3. 为什么要进行提升 4. 最佳实践 那么,我们就开始进入主题吧. 1. 变量提升 通常JS引擎会在正式执行之前先进行一次预编译,在这个过程中,首先将变量声明及函数声明提升至当前作用域的顶端,然后进行接下来的处理.(注:当前流行的JS引擎大都对源码进行了编译,由于引擎的不同,编译形式也会有
-
5 分钟读懂Python 中的 Hook 钩子函数
1. 什么是Hook 经常会听到钩子函数(hook function)这个概念,最近在看目标检测开源框架mmdetection,里面也出现大量Hook的编程方式,那到底什么是hook?hook的作用是什么? what is hook ?钩子hook,顾名思义,可以理解是一个挂钩,作用是有需要的时候挂一个东西上去.具体的解释是:钩子函数是把我们自己实现的hook函数在某一时刻挂接到目标挂载点上. hook函数的作用 举个例子,hook的概念在windows桌面软件开发很常见,特别是各种事件触发的机
-
Python中最神秘missing()函数介绍
目录 前言 1.有点价值的missing() 2.神出鬼没的missing() 3.被施魔法的missing() 4.小结 前言 一个非常神秘的魔术方法. 这个方法非常不起眼,用途狭窄,我几乎从未注意过它,然而,当发现它可能是上述"定律"的唯一例外情况时,我认为值得再写一篇文章来详细审视一下它. 本文主要关注的问题有: (1) missing()到底是何方神圣? (2) missing()有什么特别之处?擅长"大变活人"魔术? (3) missing()是否真的是上
随机推荐
- SpringMVC+MyBatis声明式事务管理
- javascript qq右下角滑出窗口 sheyMsg
- JavaScript电子时钟倒计时
- JAVA使用爬虫抓取网站网页内容的方法
- php 启动报错如何解决
- Python中的异常处理相关语句基础学习笔记
- 在ASP中调用存储过程的几种方法
- Android 应用启动欢迎界面广告的实现实例
- C#解析JSON实例
- android开发socket编程之udp发送实例分析
- jQuery 绑定事件的方式总结
- JavaScript 中 avalon绑定属性总结
- javascript检测flash插件是否被禁用的方法
- Javascript中的方法链(Method Chaining)介绍
- 初探JavaScript 面向对象(推荐)
- insert into select和select into的使用和区别介绍
- 阿里云Linux CentOS 7.2下自建MySQL的root密码忘记的解决方法
- TFDN图片播放器 不错自动播放
- jQuery过滤选择器经典应用
- 基于jquery实现放大镜效果