【C语法学习】2 - getchar()函数

1 函数原型

getchar():从标准输入流stdin中读取一个字符,函数原型如下:

int getchar(void);

cstdio库描述如下:

1. Get character from stdin.
2. Return the next character from the standard input (stdin).

2 参数

getchar()函数的参数为void。

3 返回值

getchar()函数的返回值类型为int型:

  1. 读取成功,以整形(int)的形式返回读取的字符(整型提升);
  2. 读取失败,返回EOF。

关于读取失败,分为两种情况:

  1. 读取遇到文件末尾(疑问:从stdin中读取字符怎么会遇到文件末尾);
  2. 读取过程发生错误(疑问:从stdin中读取字符会发生什么样的错误)。

cstdio库描述如下:

1. On success, the character read is returned (promoted to an int value).
2. The return type is int to accommodate for the special value EOF, which indicates faliure.
3. If the standand input was at the end-of-file, the function returns EOF and sets the eof indicator (feof) of stdin.  
4. If some other reading error happens, the function also returns EOF, but sets its error indicator (ferror) instead.

4 读取机制

  1. getchar()函数是带缓冲和回显的字符输入函数;
  2. getchar()函数一次从标准输入流stdin中读取一个字符;
  3. getchar()函数使用后需要清空标准输入流stdin。

5 示例

5.1 示例1

先从键盘输入一个字符’c’并打印,然后再从键盘输入一个字符’d’并打印,代码如下所示:

int main()
{
   //定义变量
   char ch;
   //输入字符c并回车
   ch = getchar();
   //打印字符c
   putchar(ch);
   //打印字符回车
   ch = getchar();
   putchar(ch);

   return 0;
}

代码运行结果如下图所示:

在这里插入图片描述

分析程序及运行结果:

  1. 用户从键盘输入字符’c’并按下回车键,此时标准输入流stdin中有两个字符,即字符’c’和回车符’\n’;
  2. 第一次getchar()时从标准输入流stdin中取字符’c’;
  3. 第一次putchar(ch)时输出字符’c’;
  4. 第二次getchar()时并未提示用户从键盘输入字符,因为此时标准输入流stdin中还存有一个回车符’\n’,所以getchar()函数就直接读取该回车符;
  5. 第二次putchar(ch)时直接换行。

解决办法
在使用getchar()后一定要清空标准输入流stdin,清空方法:

  1. fflush(stdin):该方法在有些编译器下不能使用,如vs2010可以使用,但vs2019不能使用(好像从vs2015之后该方法就失效了);
  2. 用户编写清空函数,代码如下所示:
void clear_stdin(void)
{
   char ch;	
   while((ch = getchar()) != '\n' && ch != EOF);
}

int main()
{
   //定义变量
   char ch;
   //输入字符c并回车
   ch = getchar();
   clear_stdin();
   //打印字符c
   putchar(ch);
   putchar('\n');
   //输入字符d回车
   ch = getchar();
   clear_stdin();
   //打印字符d
   putchar(ch);
   putchar('\n');

   return 0;
}
}

代码运行结果如下图所示:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值