string.h頭檔案中十一個重要的函式,筆記已經上傳至gitee
筆記指路:函式
不僅僅有本文的函式,還持續更新其他函式型別的解釋
文章目錄
- string.h頭檔案中十一個重要的函式,筆記已經上傳至gitee
- 一、strcat 字串追加
- 1. strncat
- 二、strstr 字串查找
- 三、strlen 求字串長度
- 四、strcpy 字串拷貝
- 1. strncpy
- 五、strcmp 字串比較
- 1. strncmp
- 六、strtok 字串劃分
- 七、memcpy 記憶體拷貝
- 八、memmove 記憶體移動
- 九、memcmp 記憶體比較
- 十、memset 記憶體重置
- 十一、strerror 錯誤資訊
一、strcat 字串追加
char * strcat ( char* strDestination, const char* strSource);
長度不受限制的字串函式(與長度無關,不夠安全)
回傳型別:char * (目標空間的起始地址,dest)
引數型別:char * 、 const char*
前者是所要加添到目標陣列,后者是需要加添的字串(陣列)
用途:在字符陣列后面追加,黏貼另外一個陣列
條件:
追加的時候保證目標空間足夠大
追加的內容里必須有’\0’
char arr1[10] = "abs"; char arr2[] = "sd"; strcat(arr1, arr2);
1. strncat
char *strncat( char *strDest, const char *strSource, size_t count );
回傳值:Each of these functions returns a pointer to the destination string.
這些函式都回傳一個指向目標字串的指標
字串給自己添加自己的字符的時候
長度受限制的字串函式
char arr[6] = "abc"; strncat(arr, arr, 2);//arr 變成 abcab char arr1[10] = "abs"; char arr2[] = "shd"; strncat(arr1, arr2, 6);//這里就算超過了追加陣列的范圍也只會加添到 //'\0'停止追加,與strncpy不同
二、strstr 字串查找
查找字串
char arr1[] = "ashwncecd"; char arr2[] = "hwn"; char* p = strstr(arr1, arr2);//在arr1中,找arr2字串如果找到了,回傳第一次出現相同字符,對應字符的地址(在查找的字串里的字符)
如果沒有找到,則回傳空指標,如果查找的字串是空字串(只有’\0’),則回傳被查找字串的起始地址
三、strlen 求字串長度
形參型別:const char* string
回傳型別:size_t 無符號整型 – unsigned int
求字串長度,遇到’\0’則停止
char arr[] = "abcdef";
int sz = strlen(arr);
易錯點:
char arr1[] = "abc"; char arr2[] = "abcde"; if(strlen(arr1) - strlen(arr2) < 0) { printf("1"); } else { printf("0"); }分析:這里的strlen(arr1) - strlen(arr2)
因為計算機在處理不同型別數相加減時,哪個能表示更大的數就轉為哪個型別,這里只有unsigned int型別,最大值為2^32-1,所以往unsigned int 轉,所以結果為一個無符號整型是整數
四、strcpy 字串拷貝
字串拷貝
長度不受限制的字串函式(與長度無關,不夠安全)
將一個字串拷貝到另外一個字串中
char* strcpy ( char * strDestination, const char* strSource );
char arr1[20] = "abc";
char arr2[] = "abdws";
strcpy(arr1, arr2);
//將arr2的內容拷貝到arr1中,記得判斷arr1的大小是否>=arr2
只拷貝到第一個’\0’截止
拷貝的內容必須有’\0’,不然會非法越界訪問
目標空間需要足夠大
目標空間必須可以改變(前沒有const)
1. strncpy
長度受限制的字串函式
char *strncpy( char *strDest, const char *strSource, size_t count );
回傳值:Each of these functions returns strDest (回傳目標陣列首元素地址)
char arr1[20] = "abcdef"; char arr2[] = "xshw"; strncpy(arr1, arr2, 4);//將4個字符拷貝進去 strncpy(arr1, arr2, 7);//遇到'\0'停止,剩下3個字符由'\0'代替
五、strcmp 字串比較
比較兩個字串內容大小,而不是長度
長度不受限制的字串函式(與長度無關,不夠安全)
引數:int strcmp( const char *string1, const char *string2 );
回傳值:
Value Relationship of string1 to string2 < 0 string1 less than string2 0 string1 identical to string2 > 0 string1 greater than string2 注意:
回傳負數或者正數不一定是 - 1 或者 1
比較到其中一個字串遇到’\0’,或兩個字符不相等時停止
實體:
char arr1[] = "abcd"; char arr2[] = "abd"; int ret = strcmp(arr1, arr2);比較到c和d兩個元素,c比d小,所以arr1相對而言比較小
回傳負數
1. strncmp
長度受限制的字串函式
int strncmp( const char *string1, const char *string2, size_t count );
指定比較到幾個字符
回傳值:
Return Value Description < 0 string1 substring less than string2 substring 0 string1 substring identical to string2 substring > 0 string1 substring greater than string2 substring
六、strtok 字串劃分
char *strtok( char *strToken, const char *strDelimit );
? 被劃分的字串, 用作劃分的符號的集合
回傳值:All of these functions return a pointer to the next token found in strToken.
回傳標記元素的首元素地址,如果標記查找完,回傳空指標
被劃分的字串中需要包含,分割符號
strtok函式的第一個引數不為 NULL ,函式將找到str中第一個標記,strtok函式將保存這個標記之后的字符在字串中的位置
strtok函式的第一個引數為 NULL ,函式將在同一個字串中被保存的位置開始,查找下一個標記,之后做相同動作
ps:該函式有記憶功能,其中可能有靜態變數
char arr[] = "rinne@163.com"; char arr1[20] = {0};//臨時資料,備份,防止之前的被修改了 char del[] = "@."; strcpy(arr1, arr); strtok(arr1, del);//第一個引數不為NULL //將@改成'\0',并且回傳r的地址 //這里 rinne 163 com 均為標記 //此時strtok函式記住了1的地址 strtok(NULL, del); //此時strtok,從1開始尋找,下一個標記,是163 //將163后的.改為'\0',回傳1的地址 //此時strtok函式又記住了c的地址
常規操作:
char arr1[] = "rinne@csdn.com"; char arr2[20] = {0};//臨時資料 char del[] = "@."; strcpy(arr2, arr1); char* ret = NULL;//記住標記的首元素地址,以列印 for(ret = strtok(arr2, del); ret != NULL; ret = strtok(NULL, del)) { printf("%s\n", ret); }
七、memcpy 記憶體拷貝
記憶體拷貝
void *memcpy( void *dest, const void *src, size_t count );
? 目標地址,需要拷貝的地址,需要拷貝資料的大小
回傳型別:dest的首元素地址
int arr1[] = {1, 2, 3, 4, 5};
int arr2[10] = {0};
memcpy(arr2, arr1, 5 * sizeof(arr1));
//列印出來 arr2 是 1 2 3 4 5 0 0 0 0 0
memcpy 拷貝自己
拷貝重疊的部分時候,可能會出現錯誤
但在vs不會出現這種情況
八、memmove 記憶體移動
在遇到拷貝重疊部分時候使用
理解上可以認為,memmove包含了memcpy
void *memmove( void *dest, const void *src, size_t count );
回傳型別:dest的首元素地址
int arr[] = {1, 2, 3, 4, 5}; memcpy(arr + 1, arr, 12);//拷貝 1 2 3 到 2 3 4
九、memcmp 記憶體比較
記憶體比較,比較陣列中元素的大小
int memcmp( const void *buf1, const void *buf2, size_t count );
這里的count是位元組
回傳值:
Return Value Relationship of First count Bytes of buf1 and buf2 < 0 buf1 less than buf2 0 buf1 identical to buf2 > 0 buf1 greater than buf2
int arr1[] = {1, 2, 3, 4, 5};
int arr2[] = {1, 2, 3};
memcmp(arr1, arr2, 4);//看arr2前2個元素arr1有沒有
memcmp(arr1, arr2, 20);
//如果位元組超過了陣列大小,會報警告,且列印出-1
十、memset 記憶體重置
陣列更改每個位元組為所需要的數
void *memset( void *dest, int c, size_t count );
需要更改成的數字,更改的位元組數
回傳值:回傳陣列首元素地址
int arr[] = {1, 2, 3, 4, 5}; memset(arr, 1, 20);//前20個位元組全變為1 memset(arr, 0, 20);//前20個位元組全變為0
十一、strerror 錯誤資訊
列印錯誤碼對應的錯誤資訊
char *strerror( int errnum );
回傳值:錯誤資訊所對應字串地址
char *p = strerror(1); printf("%s\n", p);解釋:c語言呼叫失敗的時候,會把錯誤碼存在errno這個變數里面,是c語言內置的變數
以一個例子:
int main()
{
FILE* pf = fopen("test.txt", "r");
//打開檔案函式,r是讀取的意思
//errno - 存盤錯誤碼的變數
//strerror - 可以回傳C語言內置的錯誤碼對應的錯誤資訊
if (pf == NULL)
{
//printf("%s\n", strerror(errno));
//列印 No such file or directory
perror("測驗");//列印+strerror,直接列印錯誤
//會在自定義的資訊后加上:和空格再加上錯誤資訊
//列印 測驗: No such file or directory
}
else
{
printf("打開檔案成功\n");
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/305252.html
標籤:其他
上一篇:滲透測驗中說的Shell和Webshll到底是什么?
下一篇:【Git】Git基本操作詳解
