C/C++误区四:char c = getchar();
来源:互联网 发布:免费level2行情软件 编辑:程序博客网 时间:2024/06/06 15:50
许多初学者都习惯用 char 型变量接收 getchar、getc,fgetc 等函数的返 回值,其实这么做是不对的,并且隐含着足以致命的错误。getchar 等函数的返 回值类型都是 int 型,当这些函数读取出错或者读完文件后,会返回 EOF.EOF 是一个宏,标准规定它的值必须是一个 int 型的负数常量。通常编译器都会把 EOF 定义为 -1.问题就出在这里,使用 char 型变量接收 getchar 等函数的返 回值会导致对 EOF 的辨认出错,或者错把好的数据误认为是 EOF,或者把 EOF 误认为是好的数据。例如:
int c; /* 正确。应该使用 int 型 变量接收 fgetc 的返回值 */
while ( (c = fgetc(fp)) != EOF )
{
putchar(c);
}
如上例所示,我们很多时候都需 要先用一个变量接收 fgetc 等函数的返回值,然后再用这个变量和 EOF 比较, 判断是否已经读完文件。上面这个例子是正确的,把 c 定义为 int 型保证了它 能正确接收 fgetc 返回的 EOF,从而保证了这个比较的正确性。但是,如果把 c 定义为 char 型,则会导致意想不到的后果。
首先,因为 fgetc 等函 数的返回值是 int 型的,当赋值给 char 型变量时,会发生降级,从而导致数 据截断。例如:
---------------------------------
| 十进制 | int | char |
|--------|--------------|--- ----|
| 10 | 00 00 00 0A | 0A |
| -1 | FF FF FF FF | FF |
| -2 | FF FF FF FE | FE |
---------------------------------
在此,我们假设 int 和 char 分别是 32 位和 8 位的。由上表可得,从 int 型到 char 型,损 失了 3 个字节的数据。而当我们要拿 char 型和 int 型比较的时候,char 型 会自动升级为 int 型。char 型升级为 int 型后的值会因为它到底是 signed char 还是 unsigned char 而有所不同。不幸的是,如果我们没有使用 signed 或者 unsigned 来修饰 char,那么我们无从知晓 char 到底是指 unsigned char 还是指 signed char,因为这是由编译器决定的。不过,无论 char 是 signed 的也好,unsigned 的也罢,都不能改变使用 char 型变量接收 fgetc 等函数的返回值是错误的这个事实。唯一能改变的是该错误导致的后果。前面我 们说了,char 型和 int 型比较时,char 会自动升级为 int,下面我们来看看 signed char 和 unsigned char 在转换成 int 后,它们的值有什么不同:
---------------------------------------
| char | unsigned | signed |
|-------|---------------|-- -----------|
| 10 | 00 00 00 0A | 00 00 00 0A |
| FF | 00 00 00 FF | FF FF FF FF |
| FE | 00 00 00 FE | FF FF FF FE |
----------------------------- ----------
- C / C++ 误区之四: char c = getchar();
- [转]C/C++ 误区四:char c = getchar();
- C/C++ 误区四:char c = getchar();
- C/C++误区四:char c = getchar();
- C/C++误区四:char c = getchar();
- C/C++ 误区四:char c = getchar();误区五:检查 new 的返回值
- C/C++ 误区五:char c = getchar();
- getchar.c
- (c=getchar())!=EOF
- C++误区一 char ch = getchar()
- [C陷阱]getchar的返回值是int而不是char
- 用法char ch=getchar()正确性详解 《C陷阱与缺陷》 chap5.1
- while( c= getchar(c) &&c!='\n')为什么错误
- Linuc--C--getchar
- C语言getchar函数
- C语言#getchar()函数
- scanf("%c")和getchar
- 【C语言】getchar,putchar
- 梳理shell编程遗忘的知识点笔记(三)
- C++风格的文件输入输出流
- HDU1176
- VS 用 CCCCCCCC 填充栈内存是设置软中断?
- C/C++误区三:强制转换 malloc() 的返回值
- C/C++误区四:char c = getchar();
- C/C++误区五:检查 new 的返回值
- Servlet应用之细节
- 判断整数序列是不是二元查找树的后序遍历结果
- C语言中access函数
- c++文件拷贝
- 抽象类可以不包括抽象方法 但是含有抽象方法的类必须是抽象类
- 在liunx中编写一个脚步定期删除mysql中的数据
- mysql安装图解 mysql图文安装教程(详细说明)