门户网站管理流程,建网站是什么技术,未备案网站加速,苏州网站建设兼职1. 返回整数的getchar函数
#include stdio.hmain()
{char c;while((c getchar()) ! EOF){putchar(c);}
}
上述函数是错误的#xff0c;原因在于程序中的变量c被声明为char类型#xff0c;而不是int类型#xff0c;这意味着c无法容下所有可能的字符#xff0c;特…1. 返回整数的getchar函数
#include stdio.hmain()
{char c;while((c getchar()) ! EOF){putchar(c);}
}
上述函数是错误的原因在于程序中的变量c被声明为char类型而不是int类型这意味着c无法容下所有可能的字符特别地可能无法容下EOF。最终的结果可能有
某些合法的输入在截断后与EOF相同程序将在文件复制的中途终止另一种可能是c根本无法取到EOF这个值程序陷入一个死循环部分编译器对上述实现并不正确虽然getchar返回结果赋值给char类型变量时会发生截断但是while中比较了getchar返回值和EOF
2. 更新顺序文件
为了保持与过去不能同时进行读写操作的程序的向下兼容性一个输入操作不能随后直接紧跟一个输出操作反之亦然。如果要同时进行输入和输出操作必须在其中插入fseek函数的调用。
while(fread(fread((char*)rec, sizeof(rec), 1, fp)) 1)
{//对rec执行某些操作if(/*rec必须被重新写入*/){fseek(fp, -(long)sizeof(rec), 1);fwrite((char *)rec, sizeof(rec), 1, fp);fseek(fp, 0L, 1);//虽然看上去什么也没做但它改变了文件的状态使得可以正常读写}
}
3. 缓冲输出与内存分配
当一个程序生成输出时是否有必要将输出立即展示给用户
程序输出有两种方式
即时处理方式往往造成较高的系统负担先暂存起来然后在大块写入的方式
这种控制能力一般时通过库函数setbuf实现的当buf时一个大小适当的字符数组那么修改语句如下
setbuf(stdout, buf);
语句将通知输入输出库所有写入到stdout到输出都应该使用buf作为输出缓冲区直到buf缓冲区被填满或者程序员直接调用fflush。
以下程序是错误的
include stdio.hmain()
{int c;char buf[BUFSIZ]setbuf(stdout, buf);while((c getchar()) ! EOF)putchar(c);
}
原因在于buf缓冲区最后一次被清空是在main函数结束之后作为程序交回控制给操作系统之前C运行时库所必须的清理工作的一部分但是在此之前buf字符数组已经被释放了。要避免这种类型的错误有两种办法
让缓冲数组称为静态数组可以直接显式声明buf为静态static char buf[BUFSIZ];也可以把buf声明完全移到main函数之外第二种办法是动态分配缓冲区在程序中并主动释放分配的缓冲区如下
char *malloc();
setbuf(stdout, malloc(BUFSIZ));
此时也不用考虑malloc失败的情况因为malloc分配失败时返回NULL此时经过setbuf即标准输出不需要进行缓冲程序仍然能够工作只不过速度比较慢而已。 4. 使用errno检测错误
要进行错误处理这样的写法是错误的
/*调用库函数*/
if (errno)/*处理错误*/
出错原因在于并没有强制要求库函数一定要设置errno为0这样errno的值可能是前一个执行失败的库函数设置的值。
这样写也是错误的
errno 0;
/*调用库函数*/
if (errno)/*处理错误*/
原因在于库函数调用成功时既没有强制要求对errno清零但同时也没有禁止设置设置errno比如fopen每次新建一个事先并不存在的文件时即使没有任何程序错误发生errno也仍然可能被设置。
因此正确的做法是应该首先检测作为错误提示的返回值确定程序执行失败然后在检查errno
/*调用库函数*/
if (返回的错误值)检查errno