首页 > 其他分享 >getchar()与putchar()

getchar()与putchar()

时间:2023-09-14 21:33:40浏览次数:37  
标签:ch putchar int 缓冲区 输入 getchar

( )

getchar()与putchar()

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

基本用法:

#include <stdio.h>

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

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

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


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消化掉,也就是<font color="#dd0000">清空缓冲区</font><br />

只要,再写一个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;
}

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


请添加图片描述

标签:ch,putchar,int,缓冲区,输入,getchar
From: https://blog.51cto.com/u_16237630/7474171

相关文章

  • fread实现getchar(加速!!!)
    fread实现的getchar代码:inlinecharget(){ staticcharbuf[100000],*p1=buf,*p2=buf; returnp1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}以下内容由chatgpt生成:上面的代码定义了一个名为get()的内联函数,它从标准输入......
  • 关于C语言getchar()的作用理解
    让我们先看一个程序#include<stdio.h>intmain(){charch[100];fgets(ch,10,stdin);//用标准输入设备输入fputs(ch,stdout);//用标准输出设备输出return0;}这个时候,我们输入超过10个字符,只读前十个字符;不超过10个字符,输入字符时,输出会多输出一行,说明\n也......
  • 【C语言】getchar() → 字符数据输入
    ......
  • getchar()应用示例
    #include<stdio.h>intmain(){intch=0;while((ch=getchar())!=EOF){if(ch<'0'||ch>'9'){continue;}putchar(ch);}return0;}只输......
  • getchar()和putchar()
    前面介绍过使用scanf()和printf()根据%c转换说明读写字符,同时也介绍过在输入字符时,用专门的字符处理函数效率会更高,下面将介绍两个读取和输出字符的函数:getchar()和putchar(......
  • 《C语言程序设计》1.5while(getchar()!=EOF)与xcode的适配问题
    最近在复习C语言,《C语言程序设计》1.5字符输入/输出部分涉及到如下代码:while(getchar()!=EOF)输入一段字符串并回车后发现无法跳出while循环。首先尝试用键盘输入EOF,......
  • getchar
    //getchar#include<stdio.h>intmain(){ // charpassword[20]={0}; printf("请输入密码:>"); scanf_s("%s",password); printf("请确认密码(Y/N):>"); //清......
  • C语言getchar和putchar是怎么实现的?
    所有的stdio库函数,比如包括getchar/putchar/getc/putc之类的,都会经过stdiobuffer:如果从最简单的实现来说,可以把FILE结构体定义成下面这样:typedefstruct_iobuf{......
  • scanf() getchar()输入问题
    #define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>intmain(){intret=0;intch=0;charmima[20]={0};printf("请输入密码:");scanf("%s",mima);prin......
  • C语言中的getchar、putchar函数
    getchar可以接受键盘上打印的字符,puchar可以进行输出字符比如:#include<stdio.h>intmain(){intch=getchar();putchar(ch);printf("%c\n",ch);return0;}运......