getchar() getch() getche() gets() puts() scanf()的用法及区别
getchar() putchar(ch) scanf() 头文件stdio.h
getch() getche() 头文件conio.h
gets() puts() 头文件stdio.h
getch()和getche()函数 都是从键盘上读入一个字符,但getch()函数不将读入的字符回显在显示屏幕上,而getche() 函数却将读入的字符回显到显示屏幕上。
而getchar()函数与上述两个函数的区别是:需等待输入直到按回车才结束, 回车前的所有输入字符都会逐个显示在屏幕上,但只有第一个字符作为函数的返回值。
getchar() 所在头文件 stdio.h
原型: int getchar(void); // 是stdio.h中的库函数,返回的是一个int型的数
作用是从stdin流中读入一个字符,也就是说,如果stdin有数据的话不用输入它就可以直接读取了,第一次getchar()时,确实需要人工的输入,但是如果你输了多个字符,以后的getchar()再执行时就会直接从缓冲区中读取了
有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中,直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符.getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1.
若用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.注意:已在键盘缓冲区的字符,不用等待用户按回车键就会调用getchar直到缓冲区中的字符读完为后,才等待用户按键.
键盘输入的字符都存到缓冲区内,一旦键入回车,getchar就进入缓冲区读取字符,一次只返回第一个字符作为getchar函数的值,如果有循环或足够多的getchar语句,就会依次读出缓冲区内的所有字符直到'\n'.要理解这一点,之所以你输入的一系列字符被依次读出来,是因为循环的作用使得反复利用getchar在缓冲区里读取字符,而不是getchar可以读取多个字符,事实上getchar每次只能读取一个字符
ch=getchar(); //等待从键盘上输入一个字符
putchar(ch); //输出此字符
#include <stdio.h>
int main()
{
int c;
while ((c = getchar()) != '\n') //不断循环调用getchar直至用户键入回车(即换行)
printf("%c", c);
return ;
}
结果
getch() 非标准函数,要注意移植性 所在头文件:conio.h
是一个不回显函数,当用户按下某个字符时,函数自动读取,无需按回车,有的C语言命令行程序会用到此函数做游戏,
#include<stdio.h>
#include<conio.h>
int main()
{
char c;
while((c=getch())!='\r') { //每接收到用户键入的一个字符则输出一个*直到按下了回车键
printf("*");
}
return ;
}
结果:
getche() 功能:输入后立即从控制台取字符,不以回车为结束(带回显)
#include<stdio.h>
#include<conio.h>
int main(void)
{
char ch;
printf("please input a character:");
ch=getche();
printf("\nyou have input a character '%c'\n",ch);
return ;
}
结果: 可见,1、带回显 2、一旦输入一个字符则立刻回从控制台读取
getch()和getche()函数的区别:
#include <stdio.h>
#include <conio.h>
int main()
{
char c, ch;
c=getch(); //从键盘上读入一个字符不回显送给字符变量c
putchar(c); //输出该字符
puts(""); //puts()输出内容并换行
ch=getche(); //从键盘上带回显的读入一个字符送给字符变量ch
putchar(ch);
return ;
}
针对ch=getche(); 运行结果可见会既回显用户键入的字符,又会立即从控制台取字符并由putchar(ch)输出,所以会看到两个重复的字符
gets() 读一行,从流中读取字符串,直到出现换行符或'\n'读到文件尾EOF为止,最后加上'\0'作为字符串结束。所读取的字符串暂存在给定的参数string中
原型:char * gets(char * string); //注意只能接收char* 类型,成功则返回char*类型的指针,否则返回NULL
#include <stdio.h>
int main(void)
{
char str[];
printf("Input a string.\n");
gets(str);
printf("The string you input is: %s",str); //输出所有的值,注意a
}
注意:由于gets()不检查字符串string的大小,必须遇到换行符或文件结尾才会结束输入,因此容易造成缓存溢出的安全性问题,导致程序崩溃,可以使用fgets()代替
如果输入123456(长度小于10),则输出结果为:
Input a string.
123456↙
The string you input is:123456
如果输入12345678901234567890(长度大于10),则输出结果为:
Input a string.
12345678901234567890↙
The string you input is:12345678901234567890
同时看到系统提示程序已经崩溃。
scanf() 头文件:stdio.h
原型:scanf("格式控制字符串",变量地址列表);
接受字符串时:scanf("%s",字符数组名或指针); 即第二个参数只能是字符指针,若接受int类型的数组,则需不断循环,每次取数组中的一个数
#include <stdio.h>
int main()
{
int arr[];
for(int i=; i<; ++i) {
scanf("%d",&arr[i]); //注意scanf的第一个参数里,除了以%开始的格式控制之外,最好不要加任何其他字符,像是空格、tab等
}
/*
//也可以用C++11特性等效替换
for(auto& elem : arr){
scanf("%d",&elem);
}
*/
for(int j=;j<; ++j) {
printf("%d ",arr[j]);
}
return ;
}
注意:scanf的第一个参数里,除了以%开始的格式控制之外,最好不要加任何其他字符,像是空格、tab等,因为用户在输入的时候加空格,tab或换行都可以识别的,而不是与scanf中的格式控制保持一致。
puts() 函数用来向标准输出设备(屏幕)写字符串并换行,其调用方式为,puts(s);其中s为字符串字符(字符串数组名或字符串指针),注意:puts输出字符串时要遇到'\0(即字符结束符)才停止
原型:
getchar() getch() getche() gets() puts() scanf()的用法及区别的更多相关文章
- 区分getchar(),getch(),getche()三个函数:
区分getchar(),getch(),getche()三个函数: 第一行是手动输入的,第二行是printf输出的. getch()和getche()这两个函数使用时要包含conio.h头文件: ge ...
- gets() 、 getchar() 、 getch() 、getche()、gets()、 scanf()的区别
1.getchar().getche().getch() (1).getchar 函数用于从标准输入设备键盘读入单个字符,返回表示读入字符的ASCII码值,并在屏上显示该字符:头文件是 stdio.h ...
- getch(),getche(),getchar()的区别
先说基本区别. (1) getch()和getche()函数 这两个函数都是从键盘上读入一个字符.其调用格式为: getch(); getche(); 两者的区别是 ...
- C的printf与scanf的用法
之前没学过C语言,只学过C++,所以就来自学下C语言了,其实个人认为C与C++的区别很小,基本上就是printf与scanf这点输出和输入的区别了,如果还有什么区别的话那就是要包含的头文件是不同的.比 ...
- C++中printf和scanf的用法
(一)printf的用法 printf:按格式打印,向控制台输出.print:打印 ,f:formate,格式化. 在使用printf向控制台输出时,不建议使用中文字符串,中文字符串的问题比较复杂,有 ...
- scanf *的用法
scanf *的用法 char a[LEN]="12:13:14"; char i,j,k,h,l,m; sscanf(a,"%*c%*c:% ...
- scanf,fscanf,sscanf的区别----整理
转自原文 scanf,fscanf,sscanf的区别----整理 scanf 从控制台输入 fscanf 从文件输入 sscanf 从指定字符串输入 1.例:使用scanf函数输入数据. #incl ...
- 关于scanf与gets的区别
以下内容主要来源: scanf与gets读取字符串 scanf与gets函数读取字符串的区别 前两天有个同学问我scanf与gets的区别说了半天也没说出来个所以然,就搜了一下,scanf()和get ...
- [转载]jQuery中wrap、wrapAll和wrapInner用法以及区别
原文地址:jQuery中wrap.wrapAll和wrapInner用法以及区别作者:伊少君 原文: <ul> <li title='苹果'>苹果</li> ...
随机推荐
- [转]javascript中基本类型和引用类型的区别分析
基本类型和引用类型 ECMAScript包含两个不同类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据段:引用类型值指由多个值构成的对象.当我们把变量赋值给一个变量时,解析器首先要做的就是确 ...
- bzoj 4566 找相同字符 —— 广义后缀自动机
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4566 建出两个串的广义后缀自动机: 统计每个点在两个串中出现次数的子树和,其实就是在两个串中 ...
- 经典ARP协议讲解,一定要看
以太网协议是目前最流行的通信协议之一.从底层到高层协议家族非常庞大.今天为您介绍一下经常用到却比一定知道的协议. 在链路层上,主机和路由器用他们的物理地址来标志,即48位的物理地址,也是是我们通常所说 ...
- java练习篇 求输出最大值
总结:没有把数据输入.是数组-----把要输入的数据放在数组里.错在这里 import java.util.Scanner; public class shibai { public static v ...
- Java-Runoob-高级教程:Java 9 新特性
ylbtech-Java-Runoob-高级教程:Java 9 新特性 1.返回顶部 1. Java 9 新特性 Java 9 发布于 2017 年 9 月 22 日,带来了很多新特性,其中最主要的变 ...
- proc文件系统详解(原创)
Linux系统上的/proc目录是一种文件系统,即proc文件系统.与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过 ...
- AOP(面向切面编程概念,本文为翻译)
AOP是什么 AOP为Aspect Oriented Programming的缩写.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用 ...
- 15-EasyNetQ之对延迟消息插件的支持
RabbitMQ延迟消息插件仍然在实验阶段.你使用这个功能要自担风险. RabbitMQ延迟消息插件为RabbitMQ增加了新的交换机类型,允许延时消息投递. EasyNetQ为交换机通过定义一种新的 ...
- quartz在web.xml的配置
第一步:下载所需的Jar包 commons-beanutils.ja.commons-collections.jar.commons-logging.jar.commons-digester.jar. ...
- 专利系统数据库连接出现 base-64字符串中的无效字符 错误
错误提示如图: 解决方法: 1.进注册表修改如下 2.进入系统配置页面http://10.10.0.70/eaf/init 对数据库进行重新配置 3.若不行再将如下密码修改一下 重启IIS生效