C語言中庫函數調用幾例

火星人 @ 2014-03-26 , reply:0



筆者在使用C語言編程實踐過程中發現,儘管所編程序從語法上看
是正確的,能夠調試通過,但實際執行結果卻達不到程序編製的目的
.現舉幾例說明如下,希望能起到幫助C語言初學者少走彎路的作用?
一.調用unlink失敗的原因及解決方法
unlink的原型在"io.h"中,其調用方法為unlink(filename)
,功能為刪除由filename指定的文件.一般調用方法如例1所示?
例1.刪除某一目錄下符合給定條件的文件
1 #include
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(pat
h,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來實現的,故調用re
move函數前也應如上所述的處理才能成功調用remove函數.
二.memcpy函數的正確調用方法
memcpy函數的一般調用方法為"memcpy(dest,src,n);".
其功能為把源串src中前n個字元拷貝到目的串dest中,因此目的串de
st的最後長度應是n.當目的串為空或目的串原來的長度不大於n時,
memcpy的結果是正確的,而當目的串原來的長度大於n時則調用memcp
y函數后得到的結果是錯誤的,如例2所示.
例2.編製memcpy函數演示程序
#include
#include
#include
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!=』\0』;i++)
dest=』 』;/*將dest賦空格*/
dest=』\0』;
memcpy(dest,src,n);
}
else memcpy(dest,src,n);
當然,也可自編一memcpy函數以代替庫函數memcpy,由於篇幅所
限,就不給出筆者自編的memcpy函數.與memcpy函數存在同樣問題的
函數還有mem?move函數,經過上述方法處理后亦可獲得正確結果.
三.findfirst及findnext函數的正確調用方法
為了在程序中實現文件或子目錄的搜索,顯示或刪除,C語言中一
般是藉助於findfirst及findnext庫函數來實現的.從雜誌,報紙(如軟體報)發表的大部分該類應用程序來看,大部分是採用如例3第11-
19行所示的調用方法.
例3.編程要求與例1相同
1 #include
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)...wh
ile(!findnext(&f))..."式的循環語句來解決這一問題.
上述程序均在5X86/133,Borland C++ 2.0及Turbo C下調試
通過.



[火星人 via ] C語言中庫函數調用幾例已經有89次圍觀

http://www.coctec.com/docs/linux/show-post-190491.html