1.memcpy函數
memcpy 函數用於 把資源內存(src所指向的內存區域) 拷貝到目標內存(dest所指向的內存區域);拷貝多少個?有一個size變量控制拷貝的字節數;
函數原型:void *memcpy(void *dest, void *src, unsigned int count);
用法:可以拷貝任何類型的對象,因為函數的參數類型是void*(未定義類型指針),也就是說傳進去的實參可以是int*,short*,char*等等,但是由於函數拷貝的過程是一個字節一個字節的拷貝的,所以實際操作的時候要把void*強制轉化為char*,這樣在指針加的時候才會保證每次加一個字節;
#include <stdio.h> #include <iostream> #include <assert.h> using namespace std; /********memcpy()函數原型為:void* memcpy(void* dest, void* src, size_t n); 返回指向dest的空類型指針*********/ //返回void* 類型的原因,是為了使用鏈式表達,即strlen((char*)(memcpy(dest,src,n)),這樣可以直接計算dest的長度,是程序代碼更簡潔 /****注意void* 指針的使用,即該函數允許傳入任何類型的指針數據****/ void* memcpy(void *dest, void *src, size_t n) { assert((dest != NULL) && (src != NULL)); char *dest_t = (char*)dest; //轉換成字符型一個個復制拷貝,由於函數拷貝的過程是一個字節一個字節的拷貝的, //所以實際操作的時候要把void*強制轉化為char*, char *src_f = (char*)src; //這樣在指針加的時候才會保證每次加一個字節 while (n-- > 0) { *(dest_t++) = *(src_f++); } return dest;//void* 一定要返回一個值(指針),這個和void不太一樣!函數返回指向dest的指針 } int main() { int a[5] = { 0, 1, 2 }; int *b = new int[3]; void *c = memcpy(b, a, 3 * sizeof(int)); //sizeof()可以用類型做參數,也可以傳入實際的變量 for (int i = 0; i < 3; i++) //數組做參數時,不退化為指針,統計的是數組整體占據的內存 { cout << b[i] << endl; } int *temp = (int*)c; temp++; cout << endl; cout << *temp << endl; return 0; }
注1:與strcpy相比,memcpy並不是遇到'\0'就結束,而是一定會拷貝完n個字節。
2:如果目標數組dest本身已有數據,執行memcpy()后,將覆蓋原有數據(最多覆蓋n)。
//memcpy用來做內存拷貝,你可以拿它拷貝任何數據類型的對象,可以指定拷貝的數據長度; char a[100], b[50]; memcpy(b, a,sizeof(b)); //注意如用sizeof(a),會造成b的內存地址溢出。 strcpy就只能拷貝字符串了,它遇到'\0'就結束拷貝;例: char a[100], b[50]; strcpy(a,b);
2.strcpy函數
#include <stdio.h> #include <iostream> using namespace std; /********strcpy()函數原型為:char *strcpy(char* dest, const char *src); 返回指向dest的指針*********/ //返回char* 類型的原因,是為了使用鏈式表達,即strlen(strcpy(dest,src)),這樣可以直接計算dest的長度,是程序代碼更簡潔 char* strcpy(char *dest, char *src) { if(dest == NULL || src == NULL) return NULL; char *res = dest;//保存原始dst的首地址 while(*src != '\0') { *dest = *src; dest++; src++; } *dest = '\0'; return res; } int main() { char *src = "hello world"; char *dest = new char; //strcpy(dest,src); int len = strlen(strcpy(dest,src)); cout << len << endl; cout << dest << endl; return 0; }
3.strcat函數
說明:src和dest所指內存區域不可以重疊且dest必須有足夠的空間來容納src的字符串。返回指向dest的指針。
#include <stdio.h> #include <iostream> using namespace std; char* strcat(char *dest, char *src) { if (dest == NULL) return NULL; if (src == NULL) return dest; char *head = dest; while (*dest != '\0') dest++; while (*src != '\0') { *dest = *src; dest++; src++; } *dest = '\0'; return head; } int main() { char dest[] = "nihao"; char src[] = "zhouyang"; char *res = strcat(dest, src); cout << dest << endl; system("pause"); return 0; }
4.strcmp函數
功能:比較兩個字符串大小。
實際上是對字符的ASCII碼進行比較,實現原理如下:首先比較兩個串的第一個字符,若不相等,則停止比較並得出兩個ASCII碼大小比較的結果;如果相等就接着比較第二個字符然后第三個字符等等。無論兩個字符串是什么樣,strcmp函數最多比較到其中一個字符串遇到結束符'/0'為止,就能得出結果。
返回結果:①str1小於str2,返回負值或者-1(VC返回-1);②str1等於str2,返回0;③str1大於str2,返回正值或者1(VC返回1);
#include <stdio.h> #include <iostream> #include <assert.h> using namespace std; /****strcmp原型: int strcmp(const char *str1, const char *str2)*****/ int strcmp(const char *str1, const char *str2) { assert((str1 != NULL) && (str2 != NULL)); while ((*str1 != '\0') && (*str2 != '\0')) { if (*str1 == *str2) { str1++; str2++; } else { if (*str1 > *str2) return 1; else return -1; } } if (*str1 == '\0' && *str2 == '\0') return 0; else if (*str1 == '\0' && *str2 != '\0') return -1; else if (*str1 != '\0' && *str2 == '\0') return 1; } int main() { char *str1 = "78"; char *str2 = "789"; int res = strcmp(str1, str2); cout << res << endl; system("pause"); return 0; }
5.strlen函數
功能:返回字符串的長度。
#include <stdio.h> #include <iostream> #include <assert.h> using namespace std; /********strlen()函數原型為:int strlen(const char *src); 返回字符串的長度*********/ size_t strlen(const char *str) { assert(str != NULL); int num = 0; while(*str != '\0') { str++; num++; } return num; } int main() { char *str = "123456"; int temp = strlen(str); cout << temp << endl; return 0; }
6.strncpy
功能:將字符串src中最多n個字符復制到字符數組dest中(它並不像strcpy一樣遇到NULL才停止復制,而是等湊夠n個字符才開始復制),返回指向dest的指針。
要求:如果n > dest串長度,dest棧空間溢出產生崩潰異常。該函數注意的地方和strcpy類似,但是n值需特別注意。
#include <iostream> #include <stdio.h> using namespace std; /***string.h,char *strncpy(char *dest, const char *src, size_t n), 把src所指向的字符串中以src地址開始的前n個字節復制到dest所指的數組中,並返回dest。**/ char* mystrncpy(char *dest, const char *src, size_t n) { if (dest == NULL || src == NULL || n < 0) return NULL; char *res = dest; while (n--) { *dest = *src; dest++; src++; } *dest = '\0'; return res; } int main() { char *src = "hello world"; char c[10]; char *res = mystrncpy(c, src, 7); cout << res << endl; system("pause"); return 0; }
7.strstr函數
功能:給出字符串str1, str2,判斷str2是否為str1的子字符串,如果是,返回str2在str1中對應的起始地址。
#include <stdio.h> #include <iostream> #include <assert.h> using namespace std; /**** 函數原型: extern char *strstr(const char *str1, const char *str2); str1: 被查找目標 string expression to search. str2: 要查找對象 The string expression to find. 返回值:若str2是str1的子串,則返回str2在str1的首次出現的地址;如果str2不是str1的子串,則返回NULL。 ****/ const char* strstr(const char *str1, const char *str2) { if (str1== NULL || str2 == NULL) return NULL; const char *temp = str1; const char *res = str2;while (*str1 != '\0') { temp = str1; res = str2; while (*temp== *res){ temp++; res++; } if (*res == '\0')return str1; str1++; } return NULL; } int main() { char *src = "1234567"; char *dest = "345"; const char *res = strstr(src, dest); cout << res<< endl;//cout<<重載了,會直接輸出字符串內容而不是地址 system("pause"); return 0; }