C语言中getchar()的返回类型为什么是int详解

 更新时间:2018年11月15日 14:49:07   作者:标点符  
这篇文章主要给大家介绍了关于C语言中getchar()的返回类型为什么是int的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

在C语言中有个重要的库函数getchar(),可从终端获得一个字符的ASCII码值。在终端输入字符时并非输入一个字符就会返回,而是在遇到回车换行前,所有输入的在C语言中有个重要的库函数getchar(),可从终端获得一个字符的ASCII码值。在终端输入字符时并非输入一个字符就会返回,而是在遇到回车换行前,所有输入的字符都会缓冲在键盘缓冲器中,直到回车换行一次性将所有字符按序依次赋给相应的变量,在这里一定要注意最后一个字符即'\n',该字符也会赋给一个相应的变量(当然这要你定义的用来接收字符的变量数比你输入的可见字符多一才可以)。

然而最近在重新阅读K&R的《C程序设计语言》时对getchar()这个自带的函数的返回值产生了疑惑。从字面上看,给函数返回的类型应该是char型,但在示例中,却将返回内容赋值给了int型变量,示例代码如下:

#include <stdio.h>
 
/* 将输入复制到输出 */ 
int main(void)
{
 int c;
 while ((c = getchar()) != EOF){
 putchar(c);
 }
 return 0;
}

书中给出的解释为:

因为某些潜在的重要原因,我们在此使用int类型。

这里作者并没有对重要原因给出明确的说明,我试着将int修改为char,发现程序还是能够正常编译与执行,这更加让我疑惑!经过一翻搜索,找到的答案如下。

1、getchar()除了返回正常的字符外,还会返回输入结束符EOF(end of file)。该函数原型如下:

int getchar(void)
{
 static char buf[BUFSIZ];
 static char *bb = buf;
 static int n = 0;
 if(n == 0)
 {
  n = read(0, buf, BUFSIZ);
  bb = buf;
 }
 return(--n >= 0)?(unsigned char) *bb++ : EOF;
}

2、EOF通常在<stdio.h>文件中被定义为-1:

#define BUFSIZ 512
#define _NFILE _NSTREAM_
#define _NSTREAM_ 512
#define _IOB_ENTRIES 20
#define EOF (-1)

3、各种数据类型能表示的数值范围由编译器决定。char类型在有些编译器中定义的范围为0~255,另外一些编译器中定义的范围为-128~127。当编译器中定义的范围为0~255时,用char接收getchar()返回值时就会出错。数据类型具体的定义范围可在<limits.h>文件中找到:

#define CHAR_BIT 8
#define SCHAR_MIN (-128)
#define SCHAR_MAX 127
#define UCHAR_MAX 0xff
 
#define CHAR_MIN SCHAR_MIN
#define CHAR_MAX SCHAR_MAX

4、将int改为char后能在我的电脑上正常编译,时由于我的编译器中定义的范围为-128~127,当用char接收时会隐式的转化为char类型。

5、即使编译器总定义的范围为-128~127,程序也有可能出错。虽然常见字符到127位就结束了。但是ASCII表中分配到的时256。128~256为拓展字符,如常用的欧元符号等均在内。

综上:getchar()返回的内容用更大范围区间的int型接收,才能使程序更加稳健。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • 在Visual Studio 2019中修改项目名的方法

    在Visual Studio 2019中修改项目名的方法

    这篇文章主要介绍了在Visual Studio 2019中修改项目名的方法,文中通过示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • C++ GDI实现图片格式转换

    C++ GDI实现图片格式转换

    GDI+(Graphics Device Interface Plus)是一种用于图形绘制和图像处理的应用程序编程接口(API),在Windows平台上广泛使用,本文就来介绍一下如何使用GDI实现图片格式转换吧
    2023-12-12
  • C++制作DLL文件的方法详解

    C++制作DLL文件的方法详解

    本文主要介绍如何制作DLL,将代码类中的方法以接口的形式暴露出来给exe程序使用。会涉及类厂创建方法实例、声明DLL接口、.def文件的使用等,感兴趣的可以了解一下
    2023-04-04
  • C语言学习基础知识分享

    C语言学习基础知识分享

    这篇文章主要介绍了C语言学习基础知识分享的相关资料,需要的朋友可以参考下
    2023-01-01
  • C C++ LeetCode题解在二叉树中增加一行示例详解

    C C++ LeetCode题解在二叉树中增加一行示例详解

    这篇文章主要为大家介绍了C C++ LeetCode题解在二叉树中增加一行示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • C语言实现快速排序

    C语言实现快速排序

    快速排序不一定是稳定排序,这篇文章主要为大家详细介绍了C语言实现快速排序算法,具有一定的参考价值,感兴趣的同学可以借鉴阅读
    2023-03-03
  • 介绍C语言程序中的注释等辅助语句如何使用

    介绍C语言程序中的注释等辅助语句如何使用

    C语言中分为单行注释和多行注释:单行注释 以 // 开始的这一行文本,可能不被编译器所支持;多行注释从 /* 到 */之间的所有文本,不支持嵌套,下面让我们详细来了解
    2022-04-04
  • C语言用栈和队列实现的回文检测功能示例

    C语言用栈和队列实现的回文检测功能示例

    这篇文章主要介绍了C语言用栈和队列实现的回文检测功能,结合具体实例形式分析了C语言栈和队列的定义及使用栈和队列进行回文检测的操作技巧,需要的朋友可以参考下
    2017-06-06
  • 从头学习C语言之字符串处理函数

    从头学习C语言之字符串处理函数

    这篇文章主要为大家详细介绍了C语言之字符串处理函数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下, 希望能够给你带来帮助
    2022-01-01
  • C语言百行代码绘制圣诞水晶球

    C语言百行代码绘制圣诞水晶球

    今天就是圣诞节了,本文将再教大家一个圣诞项目——圣诞水晶球,今天这个呢代码不多,但难度会有点。感兴趣的小伙伴可以跟随小编一起学习学习
    2021-12-12

最新评论