浅谈C语言中存在的陷阱和缺陷

发表于:2011-9-07 10:05

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

分享:

  库函数:

  1、注意getchar()返回整型,不是字符型。

  2、为了保持与过去不能同时进行读写操作的程序的向下兼容性,一个输入操作不能随后直接紧跟一个输出操作,反之依然,如果要同时进行输入和输出操作,必须在其中插入fseek函数的调用。例:

  • FILE *fp;  
  • struct record rec;  
  • while (fread((char *)&rec, sizeof(rec),1,fp) = 1)  
  • {  
  • if(/* */)  
  • {  
  • fseek(fp, -(long)sizeof(rec), 1);  
  • fwrite((char *)&rec, sizeof(rec), 1,fp);  
  • fseek(fp, 0l,1);  
  • }  
  • }
  •   3、缓冲输出和内存分配:

      可通过setbuf函数控制程序的缓冲输出。

  • #include <stdio.h>  
  • void main(void)  
  • {  
  • int c;  
  • char buf[BUFSIZ];  
  • setbuf(stdout,buf);  
  • while((c = getchar()) != EOF)  
  • putchar(c);  
  • }
  •   这个是不对的。buf最后一次被清空是在什么时候?答案是在main函数结束之后,作为程序交回控制给操作系统之前C运行时库所必须进行的清理工作的一部分。但是在此之前buf已经被释放。

      解决方法一是加上static 声明。也可以把buf声明完全移到main函数之外。第二种办法是动态分配缓冲区,在程序中并不主动释放分配的缓冲区

      4、不能直接使用errno检测错误,应先检测作为错误指示的返回值,确定程序已经执行失败。然后,再检查errno,搞清原因。

      /* 调用库函数 */

      if(返回的错误值)

      检查errno

    32/3<123>
    重磅发布,2022软件测试行业现状调查报告~

    关注51Testing

    联系我们

    快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

    法律顾问:上海兰迪律师事务所 项棋律师
    版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
    投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

    沪ICP备05003035号

    沪公网安备 31010102002173号