首页 > 编程知识 正文

c语言子函数调用子函数,c语言的函数调用方式

时间:2023-05-05 11:12:06 阅读:170891 作者:337

在使用C语言实践编程的过程中,发现所编写的程序语法正确,尽管能通过调试,但实际运行结果不能达到编程的目的。 通过几个例子来说明,希望能起到帮助C语言初学者少走弯路的作用。

一. unlink调用失败的原因和解决方法

unlink的原型是“io.h”,其调用方法是删除unlink(filename,功能是删除由filename指定的文件。 典型的调用方法如例1所示。

例1 .删除某个目录下满足指定条件的文件

1 #include<; dir.h>;

2voidmain(intargc,char *argv[] ) ) ) ) ) ) ) ) ) ) ) ) ) )。

3 {int done;

4 struct ffblk f;

5if(argc!=2)退出(0);

6done=findfirst(argv[1],&; f,0 );

7 if (! 丹)

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 (! findnext(&; f ) )

15 {if(f.ff_attrib!=0x10 )

16{unlink(f.ff_name} );

17 }}}}

该程序在语法上是正确的,可以通过调试生成可执行文件,但只能删除当前目录下满足指定条件的文件,不能删除指定目录下的文件。 这是因为命令行提供的目录路径没有传递到unlink。 解决方法是,首先在第五行语句之后插入以下语句,得到命令行提供的目录路径: 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所示。

示例编写memcpy函数演示程序

#include<; stdio.h>;

#include<; mem.h >;

#include<; string.h>;

语音主(语音)。

{int i;

static char dest[7]=”First ";

static char src[]=”Second ";

printf((ntargetstring1is:%s ),dest );

memcpy(dest,src,3;

printf((ntargetstring2is:%s ),dest );

memcpy(dest,src,strlen ) ) src );

printf((ntargetstring3is:%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 (dest ) >; n ) ) ) ) ) ) ) ) ) ) )。

{for(I=0; dest[i]!=’ 0’; I () ) )

dest [ I ]=’; 为dest分配空间*

dest [ I ]=’ 0’;

memcpy(dest,src,n );

}

ELSEmemcpy(dest,src,n );

当然,也可以自行编写memcpy函数来代替库函数memcpy,但由于篇幅的关系,笔者没有给出自行编写的mcpy函数。 与memcpy函数存在类似问题的函数还有memmove函数,但使用上述方法处理可以获得正确的结果。

findfirst和findnext函数的正确调用方法

为了在程序中实现文件和子目录的检索、显示、删除,在C语言中一般采用findfirst和findnext库函数来实现。 从杂志、报纸(软件报纸等)发表的这种APP大部分来看,采用了例3的第11-19行所示的调用方法。

例3 .编程要求与例1相同

1 #include<; dir.h>;

2voidmain(intargc,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;

7if(argc!=2)退出(0);

8fnsplit(argv[1],drive,dir,name,ext );

9strcpy(path,drive );

10strcat(path,dir );

1done=findfirst(argv[1],&; f,0 );

12 while (! 丹)

13{if(f.ff_attrib!=0x10 )

14{strcpy(path1,path );

15strcat(path1,f.ff_name );

16unlink(path1;

17done=findnext(&; f );

18 }

19done=findnext(&; f );

20}

本程序的目的是删除指定目录内的文件,但实际执行的结果是,满足条件的所有文件的一半被删除,为了删除所有文件,需要多次执行该程序。 例1的第7-16行所示”. if (! 丹)

. while (! 为了解决这个问题,findnext(&; f )使用…”表达式中的循环语句。

上述程序均通过5X86/133、Borland C 2.0及Turbo C调试。

2007-03-29 19:36 zz阅读(699 )注释)0)编辑收藏引用归属分类: linux c编程

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。