C语言:getchar()与putchar()


getchar() :用于读取用户从键盘输入的单个字符,它有一个整型的返回值。

原型:int getchar(void)

  • 当发生读取错误的时候,返回整型值EOF(-1);
  • 当读取正确的时候,返回用户从键盘输的第一个字符的ASCII码。

当程序调用getchar()时.运行程序时就等着用户从按键输入,用户输入的字符被存放在键盘缓冲区中,直到用户按回车为止(回车字符也放在缓冲区中)。当用户键入回车之后,getchar()才开始从输入流中每次读入一个字符,输入的字符不只一个的时候,后续的getchar()调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完之后,才等待用户按键。

getchar函数输入数字也按字符处理,单个的getchar函数输入多于一个字符时,只接收第一个字符


问题1:为什么getchar返回不是char而是int?

#include <stdio.h>

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

  直觉告诉我getchar返回值应该是char类型的,这个地方为什么不能用char类型来存储getchar()的返回值呢?

  在键盘或者屏幕上的字符都是用char类型存储的,当然也可以用int类型来存储。这个地方使用int来存储字符有一个微妙但很重要的原因:为了把有效数据和输入的结束(EOF)区分开来。getchar()在没有更多输入数据时返回一个特殊值,这个值不会跟任何实际的字符混淆,这个值称为 EOF(end of file,文件结束)。我们必须把c变量声明成一个大到足够存储任何getchar()返回的值的类型。我们不能用char类型,因为c必须大到足够容纳任意可能的char还有EOF。因此我们使用int类型。

  如果你看到这里就明白了,或者早就知道原因,那可以不用接着看了。下面是我理解这个原因的思路。

    1、getchar的函数声明

  虽然看着getchar(),直觉告诉我这应该返回char类型吧,但还是让我们看看C语言中 getchar() 的函数声明:  

             int getchar ( void );

  在Linux下输入命令:man getchar(),结果更加详细:

NAME
fgetc, fgets, getc, getchar, gets, ungetc - input of characters and strings
[…]
DESCRIPTION
fgetc() reads the next character from stream and returns it as an unsigned char cast to an int, or EOF on
end of file or error.

这样我们就明白了,getchar()从标准输入(stdin)流中读取一个字符,把它当作一个unsigned char,然后强制转化成int类型来做为返回值,如果遇到文件末尾或者错误,返回EOF。

 


问题2:EOF是什么

  用google搜索时,首先看到了这样的一个帖子: EOF的定义和如何有效的使用它

  EOF不是:

  •  一个char类型 (a char)
  •     不是一个在文件末尾出现的值 (a value that exists at the end of a file)
  •     不是一个可能在文件中间出现的值(a value that could exist in the middle of a file)

  C99标准规定(见 7.19.1 Introduction):  

EOF
which expands to an integer constant expression, with type int and a negative value, that
is returned by several functions to indicate end-of-file,that is, no more input from a
stream;

好,我们明白了 EOF 是一个宏,展开后为一个整数常量表达式(integer constant expression),是int类型(C语言中整数常量是int类型的),而且值是负值。一些函数用它作为返回值,表示流中没有更多的输入。

让我们去定义它的头文件<stdio.h>中去看看:  

#define EOF (-1)

那么 EOF 在计算机中十六进制表示形式是 0xFFFFFFFF(有符号数在计算机中是一般用补码(two’s-complement)表示)。通过getchar函数的定义,我们知道getchar() 从标准输入(stdin)流中读取一个unsigned char类型的字符0xXX,然后强制转化成int 类型 0x000000XX(对无符号数,进行零扩展),此时这个值是大于等于零的。

所以,EOF(0xFFFFFFFF)不可能出现在文件中间(文本文件中),它与字符(character)是截然不同的值。

 

摘自:https://www.cnblogs.com/3me-linux/p/4121465.html

 


putchar():向终端输出一个字符。

原型:int putchar(c)

其中ch可以是被单引号(英文状态下)引起来的一个字符,可以是介于0~127之间的一个十进制整型数(包含0和127)(超过127就不是ASCII码了),也可以是事先用char定义好的一个字符型变量。

  • 当ch为一个被单引号(英文状态下)引起来的字符时,输出该字符(注:该字符也可为转义字符),
  • 当ch为一个介于0~127(包括0及127)之间的十进制整型数时,它会被视为对应字符的ASCII代码,输出该ASCII代码对应的字符;
  • 当c为一个事先用char定义好的字符型变量时,输出该变量所指向的字符。

当整型变量ch超出8位变量的范围时,ch则会变强制转化为8位变量(即取其低八位传过去输出),当为负数的时候,由于计算机存储负数是用补码表示的,所以传过去的二进制补码也被当做正数处理,也是取其低八位。

简单来说,putchar()这个函数不会检查要输出的字符的真正范围。 在使用的时候需要注意,输出变量的范围是不是一个字符的范围内,只有在一个字符的范围内才能正确输出,不然会出错。



 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值