用C語(yǔ)言實(shí)現(xiàn)字符串拷貝函數(shù)有幾種方式
首先是使用庫(kù)函數(shù)
比如下面代碼
123void ourStrCopy(char S1[] , char S2[]){
strcpy(S1, S2); //該函數(shù)還有另一個(gè)版本可以按長(zhǎng)度截取
}
還有一個(gè)函數(shù)是memcpy,這個(gè)是內(nèi)存拷貝,原型是
123void memcpy(void *dest, const void *src, size_t n);
需要注意的是這個(gè)函數(shù)第一個(gè)和第二個(gè)指針都是void型且第二個(gè)指針不能被修改,第三個(gè)參數(shù)是需要拷貝的內(nèi)存長(zhǎng)度按字節(jié)記。
然后是用指針引用,注意這個(gè)并非賦值,而是引用,這種操作需要注意內(nèi)存。
12char s1[] = “abcdefg”;//定義一組字符串
char *s2 = s1;//按照指針拷貝字符串
第三種方法就是直接賦值了
12345678910111213void outStrCopy(char s1[] , char s2[]){
int len1 = strlen(s1);//獲取第一個(gè)字符串的長(zhǎng)度
int len2 = strlen(s2);//獲取第二個(gè)字符串的長(zhǎng)度
int len = 0; //字符串總長(zhǎng)度
if(len1 《= len2){
len = len2; //選擇COPY的長(zhǎng)度
}else{
len = len1;
}
for(int i = 0 ; i 《 len ; i++){
s1[i] = s2[i]; //實(shí)現(xiàn)數(shù)據(jù)拷貝
利用C語(yǔ)言中的函數(shù)實(shí)現(xiàn)文件的Copy
網(wǎng)上的方法大致有這樣幾種:
1、使用操作系統(tǒng)提供的復(fù)制文件的API
2、使用C語(yǔ)言本身提供的復(fù)制文件的函數(shù)
3、直接讀寫(xiě)文件,從文件角度來(lái)操作,從而直接將一個(gè)文件復(fù)制
這里我們使用的就是這第三種。
讀寫(xiě)
?。?)。按字符進(jìn)行讀寫(xiě)操作
fgetc
int fgetc(FILE *stream);
參數(shù):
@stream 流指針
返回值:
成功 返回對(duì)應(yīng)字符的int值
失敗 返回EOF(end of file) 實(shí)際上是一個(gè)結(jié)束標(biāo)志 在文件本身并不存在
fputc
int fputc(int c, FILE *stream);
參數(shù):
@c 要輸出的字符
@stream 指定的輸出流
返回值:
成功 返回對(duì)應(yīng)字符的ascii(int)的值
失敗 EOF
通過(guò) fopen fgetc fputc 實(shí)現(xiàn)文件拷貝
#include《stdio.h》
int main(int arg,char* argv[]){
FILE *fp1;
FILE *fp2;
fp1 = fopen(argv[1],“r”);
fp2 = fopen(argv[2],“w”);
if(fp1==NULL||fp2==NULL){
perror(“FILE COPY ERROR!\n”);
return -1;
}
int ch;
while((ch=fgetc(fp1))!=EOF){
fputc(ch,fp2);
}
fclose(fp1);
fclose(fp2);
}
復(fù)制文件的思路大概是這樣的,如果是文本類型,則可直接使用字符讀寫(xiě)的方式,依次讀寫(xiě)到另一個(gè)文件中。但如果是非字符型文件那應(yīng)該怎么進(jìn)行操作呢?我的方法是使用二進(jìn)制形式打開(kāi),然后依次針對(duì)字節(jié)進(jìn)行操作,依次從文件第一個(gè)字節(jié)讀寫(xiě)至最后一個(gè)字節(jié)實(shí)現(xiàn)文件的復(fù)制,那么由此可得,這種方法同樣可以用在遠(yuǎn)程的操作上,即實(shí)現(xiàn)文件的遠(yuǎn)程傳輸。
那么問(wèn)題來(lái)了,怎么針對(duì)字節(jié)來(lái)進(jìn)行讀取文件呢?這里我總結(jié)了兩種辦法。
注意:本文針對(duì)的解決方案是依字節(jié)讀取,如果覺(jué)得效率低得話可以多字節(jié)讀取,但這樣就存在一個(gè)問(wèn)題,怎么保證正好和源文件大小相同而不是比源文件大。那么推薦的做法是先獲取源文件的大小,然后直接讀取進(jìn)行操作。
在C語(yǔ)言系統(tǒng)中void型指針占用一個(gè)字節(jié),char型占用一個(gè)字節(jié),正好滿足我們的要求,所以可以分別使用來(lái)完成我們需要的操作。
需要注意,這里我們用到的概念是類型并不是限制了使用的數(shù)據(jù)類型,不是說(shuō)char型只能用來(lái)存放char型變量,數(shù)據(jù)類型提供的是一系列針對(duì)特定類型的操作,這方便了我們的操作,但不能存在思維定式,一種數(shù)據(jù)類型提供的是一種可能性,比如char型變量,它給了我們2^8種可能性,如果我們需要表示16種可能的話,完全可以使用一個(gè)char型變量來(lái)存放,而不是使用一個(gè)int型變量,節(jié)省了系統(tǒng)開(kāi)銷。但真實(shí)情況下,需要考慮到程序的易讀性問(wèn)題,而不是考慮內(nèi)存的問(wèn)題,更何況內(nèi)存已經(jīng)越來(lái)越便宜,空間越來(lái)越大,CPU性能越來(lái)越好。
源碼如下:
#include 《stdio.h》
int main(int argc, char* argv[])
{
FILE *op,*inp;
op=fopen(“a.png”,“rb”);
inp=fopen(“b.png”,“wb”);
void *buf;
char c;
while(!feof(op))
{
//方法二
fread(&buf,1,1,op);
fwrite(&buf,1,1,inp);
//方法二
fread(&c,1,1,op);
fwrite(&c,1,1,inp);
}
fclose(inp);
fclose(op);
printf(“over”);
return 0;
}
評(píng)論
查看更多