【初阶C语言】学会使用库函数getchar和putchar

简介: 【初阶C语言】学会使用库函数getchar和putchargetchar函数该函数的作用是接收一个字符,然后把该字符转化对应的ASCII值

一、getchar函数

1.作用:

    该函数的作用是接收一个字符,然后把该字符转化对应的ASCII值

2.认识函数
int getchar(void)//getchar函数原型

image.png

参数类型:括号里面的void意思是不接受参数,就是括号里面不需要写任何东西


函数作用:该函数的作用是接收一个字符,然后把该字符转化对应的ASCII值


返回值类型:因为接受一个字符后会把该字符转化成对应ASCII码值,所以返回值的ASCII码值,所以返回值的类型是整形(int)。如果getchar函数接受字符失败或者遇到文件末尾,那么他就会返回一个EOF的值,EOF的值默认为-1


3.运用

我们现在要输入大写的A,然后输出A和对应的ASCII码值

#include<stdio.h>
int main()
{
  //int ch=getchar();//这样子定义也是可以的
  int ch = 0;
  ch = getchar();//第一步,getchar会接受你冲键盘输入的值
  printf("%c\n", ch);//第二步,直接打印该字符
  printf("%d\n",ch);//打印该字符对应的ASCII码值
  return 0;
}

image.png

接下来我们类比一下两种不同接收字符的方式

image.png

相同点:都可以用来输入(接收)一个字符。

不同点:getchar函数只能用来接收字符,而接收字符只是scanf函数的一种形似。

优点   :getchar函数可以不需要变量来接收,(需要打印该字符的时候)也可以拿一个变量来接收它的返回值;但是,sacnf函数必须要有一个变量来接收,无论你要不要打印。


二、putchar函数

1.作用

在屏幕上输出(打印出)一个字符


2.定义

int putcahr(int charatcer)//putchar函数原型

image.png

函数的参数类型:这里需要的参数是一个整形字符,就是括号里面需要写的值。


函数的作用:把参数打印在屏幕上,putchar本质就是输出函数


注意:每次只可以输出一个字符


返回值类型:其返回值是输出的字符的ASCII码(即整数),若输出失败则返回EOF(常量,一般定义为-1)。

3.运用

输出的字符的方式有两种:第一种是用变量来输出,第二种是直接输出字符

//第一种输出方式
#include<stdio.h>
int main()
{
  int ch1=getchar();
    int ch2=getchar();
    putchar(ch1);//将字符存在变量中
    putcahr(ch2);//依靠变量来输出字符
  return 0;
}
//第二种输出方式
#include<stdio.h>
int main()
{
  putchar('A');//不需要变量,直接输出字符
  putchar('B');
  return 0;
}

三、getchar与putchar的运用

一般是与getchar函数配合使用。

我们要在屏幕上面输出:AB

#include<stdio.h>
int main()
{
  int ch1 = getchar();
  int ch2 = getchar();//接受字符
  putchar(ch1);
  putchar(ch2);//打印字符
  return 0;
}

四、getchar的应用

应用:清空缓冲区

题目:用代码实现密码输入并确认的场景

#include<stdio.h>
int main()
{
  char arr[20] = {0};
  printf("请输入密码\n");
  scanf("%s",arr);//这里我们先从键盘输入密码,然后回车
  printf("请确认(Y/N):");//这里我们需要再次确认我们输入的密码
  int ch = getchar();//getchar负责接受Y或N
  if ('Y' == ch)
    printf("确认成功\n");
  else
    printf("确认失败\n");
  return 0;
}

我们把上述代码运行起来

image.png

为什么呢?听完缓缓道来!原因是getchar接收的是回车这个字符,回车这个键一般相当于\n,所以这个时候ch里面存放的数据是'\n',所以'Y'!=ch,直接就显示确认失败了。


我们先了解一个东西:scanf函数和getchar函数接收数据是借助缓冲区,而缓冲区上面的数据依靠键盘来输入,我们看一个图。

image.png

什么意思呢?我用上面代码演示一下:

第一步:运行程序

image.png

因为程序刚刚运行起来,我们没有从键盘上面输入数据,所以缓冲区上面是没有东西的,就是为空的,所以光标在闪,在等待我们输入。

第二步输入数据(密码)并回车让scanf函数接收密码

image.png

image.png

这里回车键相当于\n。所以sacnf函数从缓冲区里面拿走的是abcdf,缓冲区上面还剩\n。当getchar函数接收字符的时候只能拿走\n,所以为什么没有输入Y或N屏幕上就显示确认失败了


补救方法:再用一个getchar函数接收掉\n

改进代码:

#include<stdio.h>
int main()
{
  char arr[20] = {0};
  printf("请输入密码\n");
  scanf("%s",&arr);
  getchar();//这个getchar用于接收\0
  printf("请确认(Y/N):");
  int ch = getchar();
  if ('Y' == ch)
    printf("确认成功\n");
  else
    printf("确认失败\n");
  return 0;
}

我们运行并实现看看:

image.png

我们可以看到,已经可以起到我们预期的结果了。

但是呢!还是会有bug,因为scanf函数在读取字符串的时候,遇到空格就不会再读取。我们运行起来一看便知道

运行结果:

image.png

因为一个getchar只能处理一个空格,后面的内容无法处理。那为什么不多加几个getchar呢?这样的后果你又怎么知道用户会输入多少个空格呢? 所以我们需要用循环进行改造


第二次改造的代码完整代码展示

#include<stdio.h>
int main()
{
  char arr[20] = {0};
  printf("请输入密码\n");
  scanf("%s",&arr);
  int ch = 0;
  while ((ch=getchar())!='\n')//新改进代码,用循环接收字符
  {                           //直到接收完\n才结束循环
    ;//我们循环getchar函数,所以循环体不需要执行任务语句,只需要一句空语句就可以
  }
  printf("请确认(Y/N):");
  ch = getchar();
  if ('Y' == ch)
    printf("确认成功\n");
  else
    printf("确认失败\n");
  return 0;
}

两次改造后,无论你怎么输入密码,都不会出现问题,都可以稳稳让你输入Y或N来确认密码

清空缓冲区的关键代码:

int ch = 0;
  while ((ch=getchar())!='\n')
  {                           
    ;
  }

五、总结

1.getchar是一个接收字符的函数,接收成功返回字符的ASCII值,失败返回EOF(-1)

2.putchar是一个打印字符的函数,会在屏幕上面打印出该字符

3.合理运用getcharh函数可以达成清空缓冲区的效果


相关文章
|
19天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
32 10
|
12天前
|
存储 算法 程序员
C语言:库函数
C语言的库函数是预定义的函数,用于执行常见的编程任务,如输入输出、字符串处理、数学运算等。使用库函数可以简化编程工作,提高开发效率。C标准库提供了丰富的函数,满足各种需求。
|
18天前
|
机器学习/深度学习 C语言
【c语言】一篇文章搞懂函数递归
本文详细介绍了函数递归的概念、思想及其限制条件,并通过求阶乘、打印整数每一位和求斐波那契数等实例,展示了递归的应用。递归的核心在于将大问题分解为小问题,但需注意递归可能导致效率低下和栈溢出的问题。文章最后总结了递归的优缺点,提醒读者在实际编程中合理使用递归。
44 7
|
18天前
|
存储 编译器 程序员
【c语言】函数
本文介绍了C语言中函数的基本概念,包括库函数和自定义函数的定义、使用及示例。库函数如`printf`和`scanf`,通过包含相应的头文件即可使用。自定义函数需指定返回类型、函数名、形式参数等。文中还探讨了函数的调用、形参与实参的区别、return语句的用法、函数嵌套调用、链式访问以及static关键字对变量和函数的影响,强调了static如何改变变量的生命周期和作用域,以及函数的可见性。
25 4
|
15天前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
15 0
|
15天前
|
C语言
【c语言】qsort函数及泛型冒泡排序的模拟实现
本文介绍了C语言中的`qsort`函数及其背后的回调函数概念。`qsort`函数用于对任意类型的数据进行排序,其核心在于通过函数指针调用用户自定义的比较函数。文章还详细讲解了如何实现一个泛型冒泡排序,包括比较函数、交换函数和排序函数的编写,并展示了完整的代码示例。最后,通过实际运行验证了排序的正确性,展示了泛型编程的优势。
15 0
|
19天前
|
算法 C语言
factorial函数c语言
C语言中实现阶乘函数提供了直接循环和递归两种思路,各有优劣。循环实现更适用于大规模数值,避免了栈溢出风险;而递归实现则在代码简洁度上占优,但需警惕深度递归带来的潜在问题。在实际开发中,根据具体需求与环境选择合适的实现方式至关重要。
17 0
|
28天前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
31 3
|
23天前
|
存储 编译器 C语言
C语言函数的定义与函数的声明的区别
C语言中,函数的定义包含函数的实现,即具体执行的代码块;而函数的声明仅描述函数的名称、返回类型和参数列表,用于告知编译器函数的存在,但不包含实现细节。声明通常放在头文件中,定义则在源文件中。
|
29天前
|
C语言
c语言回顾-函数递归(上)
c语言回顾-函数递归(上)
31 2