用C語言實現字符串拷貝函數有幾種方式
首先是使用庫函數
比如下面代碼
123void ourStrCopy(char S1[] , char S2[]){
strcpy(S1, S2); //該函數還有另一個版本可以按長度截取
}
還有一個函數是memcpy,這個是內存拷貝,原型是
123void memcpy(void *dest, const void *src, size_t n);
需要注意的是這個函數第一個和第二個指針都是void型且第二個指針不能被修改,第三個參數是需要拷貝的內存長度按字節記。
然后是用指針引用,注意這個并非賦值,而是引用,這種操作需要注意內存。
12char s1[] = “abcdefg”;//定義一組字符串
char *s2 = s1;//按照指針拷貝字符串
第三種方法就是直接賦值了
12345678910111213void outStrCopy(char s1[] , char s2[]){
int len1 = strlen(s1);//獲取第一個字符串的長度
int len2 = strlen(s2);//獲取第二個字符串的長度
int len = 0; //字符串總長度
if(len1 《= len2){
len = len2; //選擇COPY的長度
}else{
len = len1;
}
for(int i = 0 ; i 《 len ; i++){
s1[i] = s2[i]; //實現數據拷貝
利用C語言中的函數實現文件的Copy
網上的方法大致有這樣幾種:
2、使用C語言本身提供的復制文件的函數
3、直接讀寫文件,從文件角度來操作,從而直接將一個文件復制
這里我們使用的就是這第三種。
讀寫
(1)。按字符進行讀寫操作
fgetc
int fgetc(FILE *stream);
參數:
@stream 流指針
返回值:
成功 返回對應字符的int值
失敗 返回EOF(end of file) 實際上是一個結束標志 在文件本身并不存在
fputc
int fputc(int c, FILE *stream);
參數:
@c 要輸出的字符
@stream 指定的輸出流
返回值:
成功 返回對應字符的ascii(int)的值
失敗 EOF
通過 fopen fgetc fputc 實現文件拷貝
#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);
}
復制文件的思路大概是這樣的,如果是文本類型,則可直接使用字符讀寫的方式,依次讀寫到另一個文件中。但如果是非字符型文件那應該怎么進行操作呢?我的方法是使用二進制形式打開,然后依次針對字節進行操作,依次從文件第一個字節讀寫至最后一個字節實現文件的復制,那么由此可得,這種方法同樣可以用在遠程的操作上,即實現文件的遠程傳輸。
那么問題來了,怎么針對字節來進行讀取文件呢?這里我總結了兩種辦法。
注意:本文針對的解決方案是依字節讀取,如果覺得效率低得話可以多字節讀取,但這樣就存在一個問題,怎么保證正好和源文件大小相同而不是比源文件大。那么推薦的做法是先獲取源文件的大小,然后直接讀取進行操作。
在C語言系統中void型指針占用一個字節,char型占用一個字節,正好滿足我們的要求,所以可以分別使用來完成我們需要的操作。
需要注意,這里我們用到的概念是類型并不是限制了使用的數據類型,不是說char型只能用來存放char型變量,數據類型提供的是一系列針對特定類型的操作,這方便了我們的操作,但不能存在思維定式,一種數據類型提供的是一種可能性,比如char型變量,它給了我們2^8種可能性,如果我們需要表示16種可能的話,完全可以使用一個char型變量來存放,而不是使用一個int型變量,節省了系統開銷。但真實情況下,需要考慮到程序的易讀性問題,而不是考慮內存的問題,更何況內存已經越來越便宜,空間越來越大,CPU性能越來越好。
源碼如下:
#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;
}
評論
查看更多