本文介绍: 上述函数错误的,原因在于程序中的变量c声明char类型,而不是int类型,这意味着c无法容下所有可能字符,特别地,可能无法容下EOF。最终的结果可能有。

1. 返回整数getchar函数

#include <stdio.h>

main()
{
    char c;
    
    while((c = getchar()) != EOF)
    {
        putchar(c);
    }
}

上述函数错误的,原因在于程序中的变量c被声明char类型,而不是int类型,这意味着c无法容下所有可能字符,特别地,可能无法容下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.h>

main()
{
    int c;
    char buf[BUFSIZ]
    setbuf(stdout, buf);
    
    while((c = getchar()) != EOF)
        putchar(c);
}

原因在于buf缓冲区最后一次清空是在main函数结束之后,作为程序交回控制操作系统之前C运行时库所必须的清理工作的一部分,但是在此之前buf字符数组已经被释放了。要避免这种类型的错误有两种办法:

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

原文地址:https://blog.csdn.net/xiaoxiaoyikesu/article/details/134697971

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_39632.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注