getchar()与putchar()函数详解

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

getchar()与putchar()

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

基本用法

#include <stdio.h>

int main()
{
	char c = 0;
	c = getchar();
	putchar(c);
	return 0;
}

运行结果
在这里插入图片描述
输入一个a然后再打印a

这里getcharputcharscanfprintf的作用基本一致只不过getcharputchar只对字符类型操作而scanfprintf对指定的类型进行操作


getchar()

getchar的定义
int getchar(void)

  • 返回类型是int值所以返回的是字符的ASCII码
  • 参数列表中是void所以不必在括号中传参数
  • 如果getchar读取失败就会返回EOF

getchar()的一个重要机制

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

因为getchar是对于字符进行操作所以每次执行getchar都会取走输入缓冲区中一个字符
并且getchar还会取走回车也就是\n与空格

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

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

当输入一个字符a时同时我们会按下回车此时输入缓冲区中就有两个字符a\n
在这里插入图片描述
首先getchar()会先取走字符a然后通过putchar打印出来在这里插入图片描述
接着循环getchar()取走字符\n然后通过putchar打印出来所以在输出中光标不在输出的a的后面而在a的下一行
在这里插入图片描述
接着输入缓冲区中以无内容getchar()就会读到EOF退出循环

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


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

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


getchar()与scanf()区别

*getcharscanf的主要区别是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代码就自动打印“失败”并退出运行
在这里插入图片描述

这其实还是scamf无法读取回车在作祟
当我们输入1234567后此时在输入缓冲区中其实存的是1234567\n请添加图片描述
scanf("%s", password);语句读取字符串因为它无法读取\n所以此时scanf只会读取走1234567在输入缓冲区中还有\n请添加图片描述
所以在之后的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;
}

运行成功
在这里插入图片描述


2.字符串中有空格

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

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

如果输入的字符串是连续的也就是没有空格的此代码正常运行
在这里插入图片描述
如果输入的字符串是有字符的就会出现错误
在这里插入图片描述

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

因为输入的一段字符串一定会是以\n为结尾
在这里插入图片描述

所以在前面的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;
}

运行结果
在这里插入图片描述


请添加图片描述

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6