
C语言 getchar()函数详解
getchar()函数机制
getchar()函数实际上是int getchar(void),所以它返回的是ASCII码,所以只要是ASCII码表里有的字符它都能读取出来。在调用getchar()函数时,编译器会依次读取用户键入缓存区的一个字符(注意这里只读取一个字符,如果缓存区有多个字符,那么将会读取上一次被读取字符的下一个字符),如果缓存区没有用户键入的字符,那么编译器会等待用户键入并回车后再执行下一步 (注意键入后的回车键也算一个字符,输出时直接换行)。
来几个例子:
int main()
{
char ch;
printf("请输入字符:"); //1 2 回车
scanf("%c", &ch); // 读取 1
printf("%c", getchar()); //输出 2
}
运行实例:
第一个字符1被char ch读取,所以getchar()依次读取下一个未读取字符2
int main()
{
char ch;
printf("请输入字符:"); //1 回车
scanf("%c", &ch); //读取 1
printf("|1%c1|", getchar()); //读取并输出 回车
}
运行实例:
char ch读取第一个字符1,注意:我们说过,用户键入的回车也算一个字符,所以这里getchar()把回车读取了,输出时体现为换行
int main()
{
char ch;
printf("请输入字符:");//1 2 3 回车
scanf("%c", &ch);// 读取 1
printf("%c", getchar());// 读取并输出 2
printf("%c", getchar());// 读取并输出 3
printf("%c", getchar());// 读取并输出 回车
}
运行实例:
因为回车也算一个字符,所以如果在前面先要调用scanf()这种读取字符的函数后再键入新值调用getchar()(因为想要scanf()调用必须回车才能执行,就多了一个回车在缓存区中),建议清空缓存区再使用getchar(),不然getchar()会把前面回车也读取出来。注:可以使用fflush(stdin)清空缓存区(有的编译器用不了),推荐C语言基本语法:
char c_tmp;
while ((c_tmp = getchar() != '\n') && c_tmp != EOF);
例子:
int main()
{
char ch[3];
printf("请输入字符ch:");// 1 2 3 回车
scanf("%s", &ch);// 读取123
printf("字符ch的值:%s\n",ch);//输出 字符ch的值:123
char c_tmp;
while ((c_tmp = getchar() != '\n') && c_tmp != EOF);
printf("请输入字符:");// 1 2 3 回车
printf("%c", getchar()); //由于清空了缓存区,第一个getchar()并没有读取123之后的回车,而是读取的1
printf("%c", getchar());// 读取并输出2
printf("%c", getchar());// 读取并输出3
}
运行实例:
如果没有清空缓存区呢?(结果可能有点不好理解,多分析一下)
int main()
{
char ch[3];
printf("请输入字符ch:");// 1 2 3 回车
scanf("%s", &ch);// 读取123
printf("字符ch的值:%s\n",ch);
// char c_tmp;
// while ((c_tmp = getchar() != '\n') && c_tmp != EOF);
printf("请输入字符:");// 1 2 回车
printf("%c", getchar()); //第一个getchar()读取了123之后的回车,体现在printf("请输入字符:");中并没有换行符却换行了。
printf("%c", getchar());// 读取并输出 1
printf("%c", getchar());// 读取并输出 2
}
运行实例:
总结
getchar()在初次接触和使用时,大多数出错就是对于回车字符的读取。在调用时注意就会避免很多麻烦。调用前清空缓存区会是很好的解决办法。所以scanf()的优点就体现出来了,scanf()只有在格式化为"%c"时会读取回车符,但缺点也是无法读取含空格等字符的字符串并存储到字符数组中(严格意义上讲并不是字符串,可以理解为含格式化"%s"无法完整读取的字符组合,例如"gy gr 134 4353freg 32"这种中间有空格的)
更多推荐








所有评论(0)