首页 > 其他分享 >scanf,getchar,gets知识详解

scanf,getchar,gets知识详解

时间:2024-07-06 21:59:37浏览次数:23  
标签:scanf 空格 回车 缓冲区 回车键 gets 输入 getchar

1.scanf

   scanf用于输入数据,它处理不了空格键和回车键(enter),两者其实都是字符,键盘上每一个键位都是一个字符,空格对对应'\0',回车对应'\n'。,scanf将处理不了的这两种键放入缓冲区。

缓冲区类似数据结构中的队列,一边只负责进,一边只负责出。顺序进出。

(1)当数据为单个字符时:

由于输入单个字符时,会按下一个字符键,再按下一个回车,而scanf处理不了回车键,将其放入缓冲区。所以当下一个scanf来读数据时不用输入直接读走回车键(\n),不用输入,这就造成了麻烦,代码如下:

char a, ch;
int count = 0;
while (1) 
{
	scanf("%c", &a);
	count++;
	printf("**************\n");
	printf("%d\n", count);
}
//用count的值来反映scanf执行了多少次。

 结果如下;

输入一个a和一个回车键程序执行两次,count的值变为2

 

 2.当输入为字符串时,scanf遇到空格和回车键将其放入缓冲区代码如下:

  char a[4] = "abc";
  scanf("%s", a);
  for (int i = 0; i < 4; i++)
  {
      printf("%c ",a[i]);
  }

 字符串"abc”其实是4个字符'a','b','c','\0'。'\0'是转义字符标志着字符串的结束,在屏幕上体现为占用一小段空间。

操作过程如下:

输入z, 输入空格,输入空格,按下回车。结果如下:

 由于输入字符串,所以在输入z, 输入空格,输入空格,按下回车后,在%s的作用下会自动在结尾是添加转意字符'\0'形成字符串。由于空格和回车键全部放入缓冲区不处理,所以相当于只输入了一个字符z,结尾自动加上了转义字符'\0'。它俩就改变了字符串数组中ab的值。解释了结果z   c。注意:中间的空格就是转义字符'\0'改变了b的值,z改变了a的值。

2.getchar

  getchar作用是输入单个字符。它不处理回车键,处理空格,同样也是将回车键放入缓冲区。它的作用是与scanf作用在一起读取scanf留在缓冲区的回车键。防止影响下一次输入。

例如代码:

	char a, ch;
	int count = 0;
	while (1) 
    {
		scanf("%c", &a);
        getchar();//函数特点不需要传参
		count++;
		printf("**************\n");
		printf("%d\n", count);
	}

 结果如下:

 消除了缓冲区回车键的影响。

 测试用例2:

 

 输入a,b程序就自动停止了,没有机会输入c。a后面读取了一个回车键(\n)所以输出结果时换了行。

 

 3.gets

只用于字符串的输入

gets 读取以任何字符开头的字符串,读取的字符串包括 空格 但是不包括 回车,以 回车 结束输入,接收 空格 和 回车,但之后会丢弃 回车 并以 \0 代替。

 

   1. int main(){
   2.char a[100];
   3. gets(a);
   4.printf("%d",strlen(a));

 结果如下:

总结:

1.scanf 忽略行开头的所有空格,并以各种格式化进行数据输入,直到遇到 空格、回车 结束输入,不接收 空格 和 回车,留在缓存区中;


2.getchar 只读取一个字符,包括 空格 但是不包括 回车,回车 会留在缓冲区中;


3.gets 读取以任何字符开头的字符串,读取的字符串包括 空格 但是不包括 回车,以 回车 结束输入,接收 空格 和 回车,但之后会丢弃 回车 并以 \0 代替;

             

标签:scanf,空格,回车,缓冲区,回车键,gets,输入,getchar
From: https://blog.csdn.net/2401_83603768/article/details/140204778

相关文章

  • 24.【C语言】getchar putchar的使用
    1.基本作用 用户输入字符,getchar()获取字符(含\n:即键入的Enter)(字符本质上是以ASCII值或EOF(-1)存储的)(与scanf有区别)putchar()打印字符(把得到的ASCII值转换成字符)(相当于printf)由于getcharputchar只操作字符,因此执行效率高例:#include<stdio.h>intmain(){intch=......
  • 用PyQt5打造炫酷界面:深入解析pyqt5-custom-widgets
    在PyQt5中,使用自定义小部件可以为应用程序增添更多实用性和时尚感。pyqt5-custom-widgets是一个开源项目,提供了一系列有用且时尚的自定义小部件,如开关按钮、动画按钮等。本文将详细介绍pyqt5-custom-widgets的安装和使用方法。安装可以使用PIP进行安装(根据你的平台,可能是......
  • httpClient使用GetStringAsync、GetByteArrayAsync、GetStreamAsync三种方法的使用场
     `HttpClient`类中的`GetStringAsync`、`GetByteArrayAsync`和`GetStreamAsync`方法用于从远程服务器获取不同类型的数据。它们的主要使用场景如下:1.`GetStringAsync`方法:-使用场景:当您需要从远程服务器获取文本数据时,可以使用`GetStringAsync`方法。这通常用于......
  • QtWidgets样式表教程(附代码)
    Qt是一个跨平台的C++图形用户界面应用程序开发框架,广泛应用于桌面和嵌入式系统开发。QtWidgets是其中一个重要的模块,提供了创建经典桌面风格应用程序的基础。QtWidgets支持样式表(StyleSheets),使开发者可以通过类似于CSS的方式对界面进行美化和定制。本文将详细介绍QtWidg......
  • 关于Visual Studio报错scanf_s等*_s代码报错的解决方案
    问题:用visualstudio写代码时经常碰到scanf报错,strcpy报错等情况但是又不想改代码怎么办呢?解决办法点击"项目"点击"属性""C/C++""常规""SDL检查"设置为否然后确定即可正常编译......
  • 学习C语言两个月后的收获(篇目二) #超详细的scanf() 讲解-->基本用法、scanf() 的返回值
    一.scanf1.基本用法:scanf()读取用户的键盘输入 ---->程序在运行到这个语句的时候,会停下来,等待用户从键盘输入。当用户输入数据之后按下回车,scanf()就会处理用户的输入,将其存入变量。 scanf()是库函数,其头文件是<stdio.h>    (注:标准输入一般是键盘;标准输出......
  • 一篇文章教你如何解决vs编译器中,库函数scanf的正常使用!!!
    前言:这将是我写的第二篇博文了,以后我将会坚持每天花固定时间来写博客,希望我当我写了一定数量的文章之后,我自己简单的就能够写出质量优秀文章来,加油!!!一、scanf函数无法正常使用的原因1.错误实例在vs中如果想直接实现并使用scanf函数,很抱歉直接使用,用不了,因为编译器压根就......
  • getchar
    getchar是一个标准输入输出库中的函数,用于从标准输入流(通常是键盘)中获取一个字符。它的原型定义在标准头文件stdio.h或者cstdio中。☺️intgetchar(void);getchar函数会读取下一个输入字符,并将其作为无符号字符转换为整数后返回。如果没有可读取的字符,或者发生了错误,它会......
  • pageContext.request.contextpath、getServletContext.getRealPath(““)、request.ge
    在JavaEE(JavaEnterpriseEdition)中开发Web应用时,开发者常常需要获取Web应用的上下文路径和服务器上文件的真实路径。以下是对pageContext.request.contextPath、getServletContext().getRealPath("")和request.getContextPath()的详细解释及它们之间的区别:1.pageContext......
  • 解决C语言中scanf函数无法输入直接跳过的问题
    如果比较急的话,可以直接用这些方法,不急的话,建议读完。方法:1、看在调用该scanf函数前有没有用键盘输入过数据,有的话,可以尝试在该scanf函数前加个getchar();吃掉'\n'。2、在scanf前加一句"rewind(stdin);"(双引号里面的语句,不要把双引号也复制或打上去了),或者"fflush(stdin);",后......