A. memcpy在c語言中的含義,與strcpy區別
兩者最重要的區別是:memcpy可以進行內存地址重疊的拷貝。一個正確的strcpy原型編寫,要考慮到內存地址是否重疊的問題。。。
B. C語言實現字元串拷貝函數的幾種方法
首先是使用庫函數
比如下面代碼
void ourStrCopy(char S1[] , char S2[]){ strcpy(S1, S2); //該函數還有另一個版本可以按長度截取 }
還有一個函數是memcpy,這個是內存拷貝,原型是
void memcpy(void *dest, const void *src, size_t n); 需要注意的是這個函數第一個和第二個指針都是void型且第二個指針不能被修改,第三個參數是需要拷貝的內存長度按位元組記。
然後是用指針引用,注意這個並非賦值,而是引用,這種操作需要注意內存。
char s1[] = "abcdefg";//定義一組字元串char *s2 = s1;//按照指針拷貝字元串
第三種方法就是直接賦值了
void 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. C語言的strcpy和memcpy有啥區別啊,能舉例說明嗎,謝謝了。
strcpy是按字元串的長度進行拷貝,而memcpy是按指定的位元組數進行拷貝。
打個比方,char str[20]是一個最多可以裝下20個字元的串,但實際它的值是"abcde"5個字元,那麼你用strcpy得到的就是一個只有6個字元的串(包括最後的'\0'),相當於char s[6]。而你使用memcpy,指定拷貝20個位元組,那麼你就可以得到比"abcde\0"更長的內容,包括\0後面的也會拷貝過去。
D. 關於c語言數組的memcpy的一個問題
你這代碼編譯都不會過,怎麼還會有輸出?s、a、b在哪裡?又,memcpy是按位元組數拷貝的,你寫的memcpy(q+1,b+12,4);拷貝位元組數是4,拷貝到q+1起的4個位元組上,並沒有越界,若原來有'\0',那'\0'還在;若原來沒有,拷貝後還是沒有。
E. memcpy與memmove的區別
memcpy和memmove都是C語言的庫函數,相比於strcpy和strncpy只能拷貝字元串數組,memcpy與memmove可以拷貝其它類型的數組,但是為什麼要同時提供兩種方法呢?本文主要就是介紹這兩個函數的區別。
首先來看函數原型:
這兩個函數都是將s2指向位置的n位元組數據拷貝到s1指向的位置,區別就在於關鍵字restrict, memcpy假定兩塊內存區域沒有數據重疊,而memmove沒有這個前提條件。如果復制的兩個區域存在重疊時使用memcpy,其結果是不可預知的,有可能成功也有可能失敗的,所以如果使用了memcpy,程序員自身必須確保兩塊內存沒有重疊部分。
我們來看一組示例:
正常情況下,即使內容有重疊,src的內容也可以正確地被拷貝到了dest指向的空間。
這種情況下,src的地址小於dest的地址,拷貝前3個位元組沒問題,但是拷貝第4,5個位元組時,原有的內容已經被src拷貝過來的字元覆蓋了,所以已經丟失原來src的內容,這很明顯就是問題所在。
一般來說,memcpy的實現非常簡單,只需要順序的循環,把位元組一個一個從src拷貝到dest就行:
memmove會對拷貝的數據作檢查,確保內存沒有覆蓋,如果發現會覆蓋數據,簡單的實現是調轉開始拷貝的位置,從尾部開始拷貝:
這里 __np_anyptrlt 是一個簡單的宏,用於結合拷貝的長度檢測dest與src的位置,如果dest和src指向同樣的對象,且src比dest地址小,就需要從尾部開始拷貝。否則就和memcpy處理相同。
但是實際在C99實現中,是將內容拷貝到臨時空間,再拷貝到目標地址中:
由此可見memcpy的速度比memmove快一點,如果使用者可以確定內存不會重疊,則可以選用memcpy,否則memmove更安全一些。另外一個提示是第三個參數是拷貝的長度,如果你是拷貝10個double類型的數值,要寫成sizeof(double)*10,而不僅僅是10。
F. C語言串拷貝(strcpy)和內存拷貝(memcpy)函數有什麼不同
strcpy()函數只能拷貝字元串。strcpy()函數將源字元串的每個位元組拷貝到目錄字元串中,當遇到字元串末尾的null字元(\0)時,它會刪去該字元,並結束拷貝。 memcpy()函數可以拷貝任意類型的數據。因為並不是所有的數據都以null字元結束,所以你要為memcpy()函數指定要拷貝的位元組數。 在拷貝字元串時,通常都使用strcpy()函數;在拷貝其它數據(例如結構)時,通常都使用memcpy()函數。以下是一個使用strcpy()函數和memcpy()函數的例子: #include <stdio. h> #include <string. h> typedef struct cust-str {int id ;char last_name [20] ; char first_name[l5];} CUSTREC;void main (void); void main (void){char * src_string = "This is the source string" ; char dest_string[50]; CUSTREC src_cust; CUSTREC dest_cust; printf("Hello! I'm going to src_string into dest_string!\n"); / * Copy src_ string into dest-string. Notice that the destination string is the first argument. Notice also that the strcpy() function returns a pointer to the destination string. * / printf("Done! dest_string is: %s\n" , strcpy(dest_string, src_string)) ; printf("Encore! Let's one CUSTREC to another. \n") ; prinft("I'll src_cust into dest_cust. \n"); / * First, intialize the src_cust data members. * / src_cust. id = 1 ; strcpy(src_cust. last_name, "Strahan"); strcpy(src_cust. first_name, "Troy"); / * Now, Use the memcpy() function to the src-cust structure to the dest_cust structure. Notice that, just as with strcpy(), the destination comes first. * / memcpy(&dest_cust, &src_cust, sizeof(CUSTREC));
G. memcpy函數用法
memcpy函數用法
memcpy指的是c和c++使用的內存拷貝函數,memcpy函數的功能是從源內存地址的起始位置開始拷貝若干個位元組到目標內存地址中。
strcpy和memcpy主要有以下3方面的區別。
1、復制的內容不同。strcpy只能復制字元串,而memcpy可以復制任意內容,例如字元數組、整型、結構體、類等。
2、復制的方法不同。strcpy不需要指定長度,它遇到被復制字元的串結束符"