当前位置: 首页 > 编程日记 > 正文

区分C语言中getch、getche、fgetc、getc、getchar、fgets、gets

首先,这两个函数不是C标准库中的函数, 
 
int getch(void)    //从标准输入读入一个字符,当你用键盘输入的时候,屏幕不显示你所输入的字符。也就是,不带回显。 
int getche(void)    //从标准输入读入一个字符,键盘输入的时候,屏幕显示所输入的字符。带回显。 
 
这两个函数包含在头文件conio.h中,需要记住的是conio.h不是C标准库中的头文件。Micorsoft 和 Borland的 C编译器提供了conio.h,用来创建控制台文本用户界面。一般在Windows系统下安装了VS、VC等,就可以包含conio.h头文件。但是一般在Unix、Linux系统中, / usr / include / 中都没有这个头文件。 
 
getch和getche在等待用户从键盘输入的时候,用户按下一个键后,不需要按回车,程序自动往下执行。在Linux中,终端输入在缺省情况下是被“一锅端”的,也就是说整行输入是被一起处理的。通常,这是一种人们所希望的方便的办法,但它也意味着在读入数据时必须按一下回车键表示输入行结束后才能得到输入的数据。在游戏中,很多都提供了“老板键”,它的实现,就是利用了这两个函数。 
 
 
 
其次,除了getch和getche,其他的都是C标准库中的头文件,包含在头文件stdio.h中。 
 
 
int fgetc ( FILE *stream );  //从流stream中读一个字符。可以将标准输入stdin作为它的实参,这时候从标准输入读取一个字符。 
 
int getc(FILE *stream);      //和fgetc等效,由fgetc通过宏实现。 
int getchar ( void ); 
     //从标准输入stdin读入一个字符,程序等待你输入的时候,你可以输入多个字符,回车后程序继续执行。 
//但getchar只读入一个字符 
说明: 
getc、getchar都是通过宏定义借助fgetc实现。如getchar的实现为,#define getchar() fgetc(stdin)。 
 
char *fgets (char *str, int num, FILE *stream); 
                 //从流stream中读入最多num个字符到字符数组str中,当遇到换行符时、或读到num-1个字符时停止。 
                 //自动加上'\0'空字符结尾 
 
 
char *gets ( char *str ); 
 //从标准输入stdin读取一个字符串,遇到换行或结束时候终止。 
                 //不同于fgets,他没有指定num,所以需要注意字符数组str的大小。 
 
说明: fgets和gets之间没有宏定义的关系,彼此各自有自己的实现。蠕虫病毒的实现就是函数gets的“功劳”。gets函数的任务是从流中读入一个字符串。它的调用者会告诉它把读入的字符串放在什么地方。但是,gets()函数并不检查缓冲区大小,如果调用者提供了一个指向堆栈的指针,并且get()函数读入的字符数量超过了超过了缓冲区的空间大小,get()会愉快地将多出来的字符继续写入到堆栈中,这就覆盖了堆栈中原来的内容。如: 
 
main() 

    char line[512];    //在程序的堆栈上分配512个字符的空间 
    ... 
    gets(line);        //蠕虫病毒的入口,可以将恶意代码通过多出来的数据写入堆栈 

 
 
 
建议不要用getch和getche,因为它们不是C标准库中的函数。用它们写出的程序可移植性差,不同的编译器不保证可以包含conio.h。建议用fgets函数彻底替代gets函数。 
 
 
 
另外,绝大多数的这些get函数,都有对应的put版本。 
 
int fputc ( int character, FILE *stream ); 
 
int putc ( int character, FILE *stream );        //通过宏定义和fputc实现 
 
int putchar ( int character ); 
        //通过宏定义实现:#define putchar(c) fputc(c, stdout) 
 
 
 
int fputs ( const char *str, FILE *stream ); 
 
int puts ( const char *str ); 
 
说明:两者之间无宏定义实现关系。puts(const char *str)近似等效于fputs(cosnt char *str, stdout),不同点是前者还输出一个'\n' 
 
 
 
最后,关于EOF 
 
EOF是在stdio.h文件中定义的符号常量,值为 -1。如, 
 
fputc函数返回一个值:如果输出成功则返回值就是输出的字符;如果输出失败,则返回一个EOF。 
 
fgetc函数读字符时遇到文件结束符,函数返回一个文件结束标记EOF。如果想从一个磁盘文件顺序读入字符并在屏幕上显示,可以: 
 
ch = fgetc(fp); 
while(ch != EOF) 

    putchar(ch); 
    ch = fgetc(fp); 

 
 
注意,EOF不是可输出字符,因此不能在屏幕上显示。由于ASCII码不可能出现 -1,因此EOF定义为 -1是合适的。当读入的字符值等于 -1(即 EOF)时,表示读入的已不是正常的字符,而是文件结束符。但以上只适用于读取文本文件的情况。现在ANSI C 已经允许用缓冲文件系统处理二进制文件,而读入某一个字节中的二进制数据的值有可能是 -1,而这又恰好是EOF的值。这就出现了需要读入有用数据,却处理为“文件结束”。feof(fp) 用来测试fp所指向的文件当前状态是否是“文件结束”。如果想顺序读入一个二进制文件数据,可以: 
 
while(!feof(fp)) 

    c = fgetc(fp); 
    ... 


===================================================

三种字符输入getchar,getch,getche的区别(C语言)

getch,getchar这两个以前用过,可是遇到了getche,头一次,此时用一小段代码部分测试就知道了。

代码1:

------------------------------------------------------------------------getch()

#include<stdio.h>
#include<conio.h>

int main()
{
 char ch;
 printf("输入一个字符:");
 ch=getch();
 printf("\n你输入的字符是:'%c'\n",ch); 
    return 0;
}

--------------------------------------------------------------------
小结:

当我输入 6

字符在下一行就显示了,我的 输入就没有输入  ,回车也没有

代码2:

-----------------------------------------------------------------getchar();

#include<stdio.h>
#include<conio.h>

int main()
{
 char ch;
 printf("输入一个字符:");
 ch=getchar();
 printf("\n你输入的字符是:'%c'\n",ch); 
    return 0;
}

---------------------------------------------------------------------

小结:我输入  6之后  回车 之后字符输入了进去,此时出现的输入显示,并且中间空格了

代码3:

--------------------------------------------------------------------------------------------------------getche(); 

#include<stdio.h>
#include<conio.h>

int main()
{
 char ch;
 printf("输入一个字符:");
 ch=getche();
 printf("\n你输入的字符是:'%c'\n",ch); 
    return 0;
}

----------------------------------------------------------------------------------------------------

小结:我只是输入了一个 6  并没有回车,输入的字符显示,并且自动转入下一行继续执行。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

经过上面的代码运行,以及运行之后的比较,三种字符输入,或多或少的有细微的差别,通过运行截图,已经看出来了。我想读者应当自己试试,才能有体会,其实测试代码很简单,也很模块化,试试看看吧!

相关文章:

无限想象空间,用Python玩转3D人体姿态估计

前言姿态估计&#xff0c;一直是近几年的研究热点。它就是根据画面&#xff0c;捕捉人体的运动姿态&#xff0c;比如 2D 姿态估计&#xff1a;再比如 3D 姿态估计&#xff1a;看着好玩&#xff0c;那这玩应有啥用呢&#xff1f;自动驾驶&#xff0c;大家应该都不陌生&#xff0…

Mac中将delete键定义为删除键

在Mac中&#xff0c;delete键实际是退格键&#xff08;Backspace&#xff09;&#xff0c;fndelete才是删除键。这也是从Windows转到Mac时不习惯的地方之一。 通过安装DoubleCommand软件可以解决这个问题。安装后&#xff0c;在System Preferences中找到DoubleCommand找打开在E…

CHIL-SQL-MIN() 函数

MIN() 函数 MIN 函数返回一列中的最小值。NULL 值不包括在计算中。 SQL MIN() 语法 SELECT MIN(column_name) FROM table_name 注释&#xff1a;MIN 和 MAX 也可用于文本列&#xff0c;以获得按字母顺序排列的最高或最低值。 SQL MIN() 实例 我们拥有下面这个 "Orders&quo…

Google排名第一的语言,引数十万人关注:搞定它,技术大牛都甘拜下风

毋庸置疑&#xff0c;Python越来越被认可为程序员新时代的风口语言。无论是刚入门的程序员&#xff0c;还是年薪百万的 BATJ 的大牛都无可否认&#xff1a;Python的应用能力是成为一名码农大神的必要项。 所以&#xff0c;很多程序员把Python当做第一语言来学习。 但对于Python…

CSS滤镜详解

CSS滤镜详解 简介〓 设置文字透明层次&#xff0c;模糊效果&#xff0c;给文字加光晕等这些本来要靠图片才能处理的效果&#xff0c;现在CSS可以既简单又快速的把它实现了……接着往下看就知道了。 〓正文〓 语法&#xff1a;STYLE"filter:filtername(fparameter1, fpa…

php实现单链表

<?php //单链表的存储结构 class Node{ public $data;//数据域 public $next;//指针域 指向下一个结点 function __construct(){ $this->data null; $this->next null; } } //单链表数据类型 class LinkList{ public $data; public $next; function _…

2017-2-23 C#基础 中间变量

用中间变量做这个题 1、“请输入年份&#xff1a;”&#xff08;1-9999&#xff09; “请输入月份&#xff1a;”&#xff08;1-12&#xff09; “请输入日期&#xff1a;”&#xff08;要判断大小月&#xff0c;判断闰年&#xff09; 判断输入的时间日期是否正确 2、计算输入的…

HTA的简单应用

HTA简介&#xff1a;HTA是HTML Application的缩写&#xff08;HTML应用程序&#xff09;&#xff0c;是软件开发的新概念&#xff0c;直接将HTML保存成HTA的格式&#xff0c;就是一个独立的应用软件&#xff0c;与VB、C等程序语言所设计的软件没什么差别。下面是一个HTA的例子&…

300亿美元,AMD为什么要买Xilinx?

作者 | Just来源 | CSDN(ID:CSDNnews)自2015年5月&#xff0c;Intel&#xff08;英特尔&#xff09;以167亿美元收购FPGA生产商Altera后&#xff0c;半导体行业接连传出大整合。上个月&#xff0c;NVIDIA&#xff08;英伟达&#xff09;宣布以400亿美元收购芯片设计公司Arm&…

PIM-SSM简介

源特定组播(SSM&#xff1a;Source Specific Multicast)是一种区别于传统组播的新的业务模型&#xff0c;它使用组播组地址和组播源地址同时来标识一个组播会话&#xff0c;而不是向传统的组播服务那样只使用组播组地址来标识一个组播会话。SSM保留了传统PIM-SM模式中的主机显示…

MyBatis开发入门二:一对多连表查询

1. 步骤&#xff1a; (1). 加包(2). 编写db.properties&#xff1b;编写conf.xml&#xff0c;将db.properties加入到conf.xml&#xff1b;引入别名(3). 建立实体类(4). 编写sql操作对应的***Mapper.xml文件(5). 将sql操作对应的***Mapper.xml文件注册到conf.xml文件中(6). 编写…

ASP.NET里的事务处理

出自&#xff1a; http://blog.csdn.net/ycl111/ 事务是一组组合成逻辑工作单元的数据库操作&#xff0c;虽然系统中可能会出错&#xff0c;但事务将控制和维护每个数据库的一致性和完整性。如果在事务过程中没有遇到错误&#xff0c;事务中的所有修改都将永久成为数据库的一部…

JAVA的正则表达式语法

Java 正则表达式表达式意义&#xff1a;1.字符x 字符 x。例如a表示字符a\\ 反斜线字符。在书写时要写为\\\\。&#xff08;注意&#xff1a;因为java在第一次解析时,把\\\\解析成正则表达式\\&#xff0c;在第二次解析时再解析为\&#xff0c;所以凡是不是1.1列举到的转义…

应届生失业率或继续上升?别怕,这份秋招指南请收好!

受疫情影响&#xff0c;今年的就业形势基本上没跑了&#xff1a;“各行各业&#xff0c;大小企业&#xff0c;全面缩招&#xff01;”据国家统计局7月份的最新数据显示&#xff1a;20-24岁大专及以上人员&#xff08;主要为新毕业大学生&#xff09;失业率比去年同期高 3.3 个百…

微信小程序把玩(三十五)Video API

原文:微信小程序把玩&#xff08;三十五&#xff09;Video API电脑端不能测试拍摄功能只能测试选择视频功能&#xff0c;好像只支持mp4格式&#xff0c;值得注意的是成功之后返回的临时文件路径是个列表tempFilePaths而不是tempFilePath文档写的有点问题。 主要属性&#xff1a…

使用.NET发送邮件

出自&#xff1a; http://blog.csdn.net/ycl111/如果你曾经使用过ASP来发送邮件&#xff0c;你大概会使用CDONTS,但是在.NET里&#xff0c;发送邮件的功能已经封装进 .NET Framework的System.Web.Mail的命名空间里了&#xff0c;使用这个命名空间下类&#xff0c;就可以很容易…

采摘工人月薪十万却无人应聘,英澳农场求助 AI

作者 | 神经小兮来源 | HyperAI超神经金秋时节&#xff0c;本是收获的季节&#xff0c;但是英国、澳大利亚等地的果农却愁容满面。眼看着日渐成熟的瓜果就要烂在地里&#xff0c;却还招不到采摘工人。缺人&#xff0c;成为果农们眼下急需解决的问题。虽然大型联合收割机早已普及…

好记性不如烂笔杆-android学习笔记二 Acitvity lifecycle 生命周期

7&#xff0c;//Acitvity lifecycle 生命周期/***1,一个Activity就是一个类&#xff0c;并且这个类要继承Activity*2&#xff0c;复写onCreate方法*3&#xff0c;每个Activity需要在Androidmanifest.xml文件中配置*4&#xff0c;为Activity添加控件*/ 1 public class Activity …

hdu5740

考验代码能力的题目&#xff0c;感觉网络流一要求输出方案我就写的丑 http://www.cnblogs.com/duoxiao/p/5777632.html 官方题解写的很详细 因为如果一个点染色确定后&#xff0c;整个图的染色也就确定了&#xff1b; 对于两个点u和v, 令它们之间的最短路是dis(u,v), 那么交换它…

xml操作类(转载)

作者&#xff1a;未知 请与本人联系 <%Class XMLDOMDocument Private fNode,fANode Private fErrInfo,fFileName,fOpen Dim XmlDom 返回节点的缩进字串 Private Property Get TabStr(byVal Node) TabStr"" If Node Is Nothing Then Exit Property …

对HDS AMS 2000+巡检案例

1. 使用工具&#xff1a;笔记本&#xff0c;网线一根&#xff0c; 2. 使用软件&#xff1a;vmware虚拟机&#xff08;安装XP P2系统&#xff0c;最好为P3&#xff09;&#xff0c;HSNM2-1152-W-CLI-P01.exe&#xff08;AMS 200管理软件&#xff09;&#xff0c;jre…

用Python实现坦克大战游戏 | 干货贴

作者 | 李秋键出品 | AI科技大本营&#xff08;rgznai100&#xff09;《坦克大战》是1985年日本南梦宫Namco游戏公司在任天堂FC平台上&#xff0c;推出的一款多方位平面射击游戏。游戏以坦克战斗及保卫基地为主题&#xff0c;属于策略型联机类。同时也是FC平台上少有的内建关卡…

SPU、SKU、ARPU是什么,我来记录一下我的理解

在电商系统里经常会提到“商品”、“单品”、“SPU”、“SKU”这几个词&#xff0c;那么这几个词到底是什么意思呢&#xff1f;既然不知道是什么&#xff0c;那么我们就查一下&#xff1a;SPU Standard Product Unit &#xff08;标准化产品单元&#xff09;&#xff0c;SKUst…

用C#操纵IIS(代码)

using System;using System.DirectoryServices;using System.Collections;using System.Text.RegularExpressions;using System.Text;/*** author 吴海燕* email wuhy80-usualyahoo.com* 2004-6-25 第一版*/ namespace Wuhy.ToolBox{/// <summary>/// 这个类是静态类。…

linux 内核参数调整说明

linux 内核参数调整说明 所有的TCP/IP调优参数都位于/proc/sys/net/目录。例如, 下面是最重要的一些调优参数, 后面是它们的含义: 1. /proc/sys/net/core/rmem_max — 最大的TCP数据接收缓冲。2. /proc/sys/net/core/wmem_max — 最大的TCP数据发送缓冲。3. /proc/sys/net/ipv4…

Java 最高均薪 19015 元! 9 月程序员工资出炉,你拖后腿了吗?

在全员争当码农的时代&#xff0c;如果你也想学一门编程语言&#xff0c;那么&#xff0c;我要告诉你&#xff0c;Java 是编程语言中不可撼动的王者。有点难理解&#xff1f;先看个排行榜???? 来自权威开发语言排行榜 TIOBE 的数据&#xff08;截止到 2020 年 4 月&#x…

java 基础知识八 正则表达式

正则表达式 是一种可以用于模式匹配和替换的规范&#xff0c; 一个正则表达式就是由普通的字符&#xff08;例如字符a到z&#xff09;以及特殊字符&#xff08;元字符&#xff09;组成的文字模式&#xff0c; 用以描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为…

PHP中Session的使用

启用配置//修改php.ini中的session.auto_start 0 为 session.auto_start 1session_start();$_SESSION[username]"HM";

《Two Dozen Short Lessons in Haskell》学习(八)- Function Types, Classes, and Polymorphism

《Two Dozen Short Lessons in Haskell》&#xff08;Copyright © 1995, 1996, 1997 by Rex Page&#xff0c;有人翻译为Haskell二十四学时教程&#xff0c;该书如果不用于赢利&#xff0c;可以任意发布&#xff0c;但需要保留他们的copyright&#xff09;这本书是学习 Ha…

图神经网络快速爆发,最新进展都在这里了

译者 | 刘畅出品 | AI科技大本营&#xff08;rgznai100&#xff09;近年来&#xff0c;图神经网络&#xff08;GNNs&#xff09;发展迅速&#xff0c;最近的会议上发表了大量相关的研究论文。本文作者正在整理一个GNN的简短介绍和最新研究报告的摘要。希望这对任何准备进入该领…