在使用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编程