C语言中库函数调用几例

2016-02-19 19:15 15 1 收藏

图老师小编精心整理的C语言中库函数调用几例希望大家喜欢,觉得好的亲们记得收藏起来哦!您的支持就是小编更新的动力~

【 tulaoshi.com - 编程语言 】

作者在使用C语言编程实践过程中发现,尽管所编程序从语法上看正确的,能够调试通过,但实际执行结果却达不到程序编制的目的。现举几例说明如下,希望能起到帮助C语言初学者少走弯路的作用。
  
  一.调用unlink失败的原因及解决方法
  
   !-- frame contents -- !-- /frame contents --   unlink的原型在”io.h”中,其调用方法为unlink(filename,功能为删除由filename指定的文件.一般调用方法如例1所示。
  
  例1.删除某一目录下符合给定条件的文件
  
  1 #include<dir.h>
  
  2 void main(int argc,char *argv[])
  
  3 {int done;
  
  4 strUCt ffblk f;
  
  5 if(argc!=2) exit(0);
  
  6 done=findfirst(argv[1],&f,0);
  
  7 if(!done)
  
  8 {if(f.ff_attrib!=0x10)
  
  9 {unlink(f.ff_name);
  
  10 while(!findnext(&f))
  
  11 {if(f.ff_attrib!=0x10)
  
  12 {unlink(f.ff_name);
  
  13 }}}
  
  14 else while(!findnext(&f))
  
  15 {if(f.ff_attrib!=0x10)
  
  16 {unlink(f.ff_name);
  
  17 }}}}
  
  本程序从语法上看是正确的,能够调试通过并生成可执行文件,但只能删除当前目录下符合给定条件的文件,无法删除指定目录下的文件,原因就在于命令行给出的目录路径未能传递给unlink.解决方法为首先在第5行语句后插入如下语句,以获得命令行给出的目录路径 :fnsplit(argv[1],drive,dir,name,ext);strcpy(path,drive);strcat(path,dir);
  
  然后使用如下两种方法之一即可保证在命令行指定的目录路径下调用unlink:
  
  1.在第6行语句前面插入”chdir(path);”语句。
  
  2.用”strcpy(path1,path);strcat(path1,f.ff_name);unlink(path1);”代替例1中的”unlink(f.ff_name);”语句.
  
  此外,由于remove函数是通过调用宏unlink来实现的,故调用remove函数前也应如上所述的处理才能成功调用remove函数。
  
  二.memcpy函数的正确调用方法
  
  memcpy函数的一般调用方法为”memcpy(dest,src,n);”。其功能为把源串src中前n个字符拷贝到目的串dest中,因此目的串dest的最后长度应是n.当目的串为空或目的串原来的长度不大于n时,memcpy的结果是正确的,而当目的串原来的长度大于n时则调用memcpy函数后得到的结果是错误的,如例2所示。
  
  例2.编制memcpy函数演示程序
  
  #include<stdio.h>
  
  #include<mem.h>
  
  #include<string.h>
  
  void main(void)
  
  {int i;
  
  static char dest[7]=”First”;
  
  static char src[]=”Second”;
  
  printf(”\nTarget string 1 is :%s”,dest);
  
  memcpy(dest,src,3);
  
  printf(”\nTarget string 2 is :%s”,dest);
  
  memcpy(dest,src,strlen(src));
  
  printf(”\nTarget string 3 is :%s”,dest);
  
  }
  
  本程序输出结果应为:Target string 1 is:First
  
  Target string 2 is:Sec
  
  Target string 3 is:Second
  
  但实际输出结果却是:Target string 1 is:First
  
  
  Target string 2 is:Secst
  
  Target string 3 is:Second
  
  显然,如此调用memcpy函数有时会得到错误的结果.若用如下语句代替”memcpy(dest,src,n);”语句,即可得到正确的结果。
  
  if(strlen(dest)>n)
  
  {for(i=0;dest[i]!=’\0’;i++)
  
  dest[i]=’ ’;/*将dest赋空格*/
  
  dest[i]=’\0’;
  
  memcpy(dest,src,n);
  
  }
  
  else memcpy(dest,src,n);
  
  当然,也可自编一memcpy函数以代替库函数memcpy,由于篇幅所限,就不给出笔者自编的mcpy函数.与memcpy函数存在同样问题的函数还有memmove函数,经过上述方法处理后亦可获得正确结果。 更多内容请看C/C++进阶技术文档专题,或 三.findfirst及findnext函数的正确调用方法
  
  为了在程序中实现文件或子目录的搜索,显示或删除,C语言中一般是借助于findfirst及findnext库函数来实现的.从杂志,报纸(如软件报)发表的大部分该类应用程序来看,大部分是采用如例3第11-19行所示的调用方法。
   !-- frame contents -- !-- /frame contents --
  例3.编程要求与例1相同
  
  1 #include<dir.h>
  
  2 void main(int argc,char *argv[])
  
  3 {char path[MAXPATH],path1[MAXPATH];
  
  4 char drive[MAXDRIVE],dir[MAXDIR],name[MAXFILE],ext[MAXEXT];
  
  5 int done;
  
  6 struct ffblk f;
  
  7 if(argc!=2) exit(0);
  
  8 fnsplit(argv[1],drive,dir,name,ext);
  
  9 strcpy(path,drive);
  
  10 strcat(path,dir);
  
  11 done=findfirst(argv[1],&f,0);
  
  12 while(!done)
  
  13 {if(f.ff_attrib!=0x10)
  
  14 {strcpy(path1,path);
  
  15 strcat(path1,f.ff_name);
  
  16 unlink(path1);
  
  17 done=findnext(&f);
  
  18 }
  
  19 done=findnext(&f);
  
  20 }}
  
  本程序目的为删除指定目录下的文件,但实际执行结果却是符合条件的全部文件的一半被删除了,需要多次运行该程序才能把全部文件删除。可采用例1第7-16行所示的” ...if(!done)
  
  ... while(!findnext(&f))...”式的循环语句来解决这一问题。
  
  上述程序均在5X86/133,Borland C++ 2.0及Turbo C下调试通过。 更多内容请看C/C++进阶技术文档专题,或

来源:http://www.tulaoshi.com/n/20160219/1620444.html

延伸阅读
在c++中,为了解决一些频繁调用的小涵数大量消耗栈空间或者是叫栈内存的问题,非凡的引入了inline修饰符,表示为内联涵数。 !-- frame contents -- !-- /frame contents -- 可能说到这里,很多人还不明白什么是栈空间,其实栈空间就是指放置程序的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,假如频...
相信很多人都看过设计模式方面的书,大家有什么体会呢?Bridge,Proxy,Factory这些设计模式都是基于抽象类的。使用抽象对象是这里的一个核心。        !-- frame contents -- !-- /frame contents -- 其实我觉得框架化编程的一个核心问题是抽象,用抽象的对象构建程序的主体框架,这...
一、sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 二、sizeof的使用方法 1、用于数据类型 sizeof使用形式:sizeof(type) 数据类型...
自己总结的,觉得能帮助初学者看透一些纷繁复杂的语法规则,理解C语言的真谛 第一次发布,不一定正确,欢迎讨论、指正、补充 1. 表达式定律 !-- frame contents -- !-- /frame contents -- 任何能产生数值结果的运算、操作都可以作为表达式,并可以放到任何需要数值结果的地方,只要数值类型能...
基于对象的程序设计的好处大家应该都有一定的体会,但是在 C 语言中并不支持类的概念,不过我们可以通过 strUCt 实现一些基础的类对象,如队列、堆栈等。通过对象的实现可以在一定程度上提高编程效率、简化 C程序设计。下面使用一个例子来介绍下如何在实现一个简单的类,希望对大家有些益处: /* 应用消息队列类 */ struct Ap...

经验教程

681

收藏

99
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部