getchar()与putchar()函数详解

简介: getchar与putchar其实最基本的作用就是用getchar读取一个字符,再用putchar输出一个字符

getchar()与putchar()


getchar与putchar其实最基本的作用就是用getchar读取一个字符,再用putchar输出一个字符


基本用法:


#include <stdio.h>
int main()
{
  char c = 0;
  c = getchar();
  putchar(c);
  return 0;
}


运行结果:


e427bf5f6f7c451bb37e196953ed14d4.png




输入一个a,然后再打印a


这里getchar和putchar 与scanf和printf的作用基本一致,只不过getchar,putchar只对字符类型操作,而scanf,printf对指定的类型进行操作


getchar()


getchar的定义:

int getchar(void)


返回类型是int值,所以返回的是字符的ASCII码

参数列表中是void,所以不必在括号中传参数

如果getchar读取失败,就会返回EOF

getchar()的一个重要机制

在getchar函数的作用与键盘间,存在一个输入缓冲区,从键盘输入的内容会存在这个缓冲中,接下来getchar函数会从缓冲区中取走内容


f59f3dc86ad84eadb2eb5d6fe1435605.png





因为getchar是对于字符进行操作,所以每次执行getchar都会取走输入缓冲区中一个字符

并且getchar还会取走回车也就是\n与空格


我们用下面的代码进行对输入缓冲区机制的测试:


int main()
{
  char ch = 0;
  while ((ch = getchar()) != EOF)
  {
  putchar(ch);
  }
  return 0;
}


当输入一个字符a时,同时我们会按下回车,此时输入缓冲区中就有两个字符:a\n



c32763e4b7414da8b0df7cec5b5da5d1.png



首先,getchar()会先取走字符a,然后通过putchar打印出来


b6a67435739942cda03b5d0f40b94550.png



接着循环,getchar()取走字符\n,然后通过putchar打印出来,所以在输出中光标不在输出的a的后面,而在a的下一行



47789a926c544e7ca35c7fe8c52f2d3a.png


接着,输入缓冲区中以无内容,getchar()就会读到EOF,退出循环


还可以用以下代码更进一步验证getchar()对于回车的读取:



int main()
{
  int i = 0;
  char ch = 0;
  while ((ch = getchar()) != EOF)
  {
  putchar(ch);
  i++;
  }
  printf("%d", i);
  return 0;
}



输入字符a和b,这里实际上是输入a后,按一次回车,输入b后,按一次回车,所以输入缓冲区中的内容为:a\nb\n,所以getchar()会读取四次,所以i的值为会是4



362f1cf0bcac4476b6d73a69e879cbfd.png



getchar()与scanf()区别


*getchar与scanf的主要区别是getchar能读取输入缓冲区中的一切字符类型,包括空格与回车,而scanf()不能读取空格与回车


putchar()

putchar的定义:

int putchar ( int character );


传的参数是要输出的字符变量

putchar的用法与printf("%c",character)一致,都是输出一个字符

实例


1.清空缓冲区

下面一段把代码是输入一段密码,并且还要用getchar()接受是否确认密码的选项:


int main()
{
  char password[20] = { 0 };
  int ch = 0;
  printf("输入密码\n");
  scanf("%s", password);
  printf("请确认密码(Y/N):");
  ch = getchar();
  if (ch == 'Y')
  {
  printf("成功\n");
  }
  else
  {
  printf("失败\n");
  }
  return 0;
}



我们输入一端密码后,还未输入Y或N,代码就自动打印“失败”并退出运行


29d34ef8205d4e4d8470d393d7d38322.png

这其实还是scamf无法读取回车在作祟

当我们输入1234567后,此时在输入缓冲区中其实存的是:1234567\n



60689f091f92434dbf6adc48f0968a1c.png



scanf("%s", password);语句读取字符串,因为它无法读取\n所以此时scanf只会读取走1234567,在输入缓冲区中还有\n




8aa89f7c4ce5446c8ec05f2cd1a3f81b.png



所以在之后的ch = getchar();中,就会读取\n,不等于Y,所以会打印失败


所以,要把缓冲中的 \n 消化掉,也就是清空缓冲区


只要,再写一个getchar()语句,将\n读取走,就可以了


代码如下:

int main()
{
  char password[20] = { 0 };
  int ch = 0;
  printf("输入密码\n");
  scanf("%s", password);
  printf("请确认密码(Y/N):");
  getchar();   //清空缓冲区
  ch = getchar();
  if (ch == 'Y')
  {
  printf("成功\n");
  }
  else
  {
  printf("失败\n");
  }
  return 0;
}


运行成功

c4583112f82e4f1d88483e8f85295f44.png


2.字符串中有空格

以下代码是输入一个字符串再输出:


int main()
{
  char str[20] = { 0 };
  scanf("%s", str);
  printf("%s", str);
  return 0;
}


如果输入的字符串是连续的,也就是没有空格的,此代码正常运行



3e6547176f7047db8cbfd5132d8468e2.png



如果输入的字符串是有字符的,就会出现错误


be1c5cb22e114832a0eb2cf1033f1c33.png

错误的原因还是scanf无法读取缓冲区中的空格,所以接下来要使用getchar去读取字符串


因为输入的一段字符串一定会是以\n为结尾


5891b148c4b34a958b1b84eba02a881f.png

所以在前面的while ((ch = getchar()) != 'EOF)改成while ((ch = getchar()) != '\n')即可,只要不遇到\n就一直读取下去


代码如下:


int main()
{
  char str[20] = { 0 };
  char ch = 0;
  while ((ch = getchar()) != '\n')
  {
  putchar(ch);
  }
  return 0;
}


运行结果:


c13a565123a14805bab6c72dfe82b5d9.png

————————————————

ccbf21aa7a37414da2bdf56a3b65c6d6.gif

目录
相关文章
|
29天前
|
存储 C语言
【C语言小知识】getchar与putchar
【C语言小知识】getchar与putchar
|
3月前
putchar()函数
【6月更文挑战第24天】putchar()函数。
36 2
|
3月前
|
C语言
用getchar和putchar读/写字符
用getchar和putchar读/写字符
19 0
|
4月前
getchar()&putchar()函数
getchar()&putchar()函数。
23 1
scanf和getchar区别
scanf和getchar区别
150 0
|
11月前
getchar() & putchar() 函数
getchar() & putchar() 函数。
125 2
|
11月前
getchar、putchar以及输入缓冲区(上)
getchar、putchar以及输入缓冲区(上)
|
11月前
|
数据安全/隐私保护
getchar、putchar以及输入缓冲区(下)
getchar、putchar以及输入缓冲区(下)
|
C语言
【C语言】scanf/fscanf/sscanf和printf/fprintf/sprintf的详细介绍
【C语言】scanf/fscanf/sscanf和printf/fprintf/sprintf的详细介绍
|
C语言
C语言常见输入函数(scanf(),getchar(),getche(),getch(),gets())大汇总
C语言常见输入函数(scanf(),getchar(),getche(),getch(),gets())大汇总
85 0