C語言中庫函式呼叫幾例(轉)

ba發表於2007-08-10
C語言中庫函式呼叫幾例(轉)[@more@]筆者在使用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(" Target string 1 is :%s",dest);
memcpy(dest,src,3);
printf(" Target string 2 is :%s",dest);
memcpy(dest,src,strlen(src));
printf(" Target 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++)
dest=’ ’;/*將dest賦空格*/
dest=’’;
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下除錯
透過.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-941628/,如需轉載,請註明出處,否則將追究法律責任。

相關文章