C语言——常见的字符串函数+内存操作函数的介绍及实现
文章目錄
- 前言
- 一、字符串函數
- 1.求字符串長度 strlen
- 2.長度不受限制的字符串函數strcpy、strcat、strcmp
- 字符串拷貝 strcpy
- 字符串追加拷貝 strcat
- 字符串比較 strcmp
- 3.長度受限制的字符串函數strncpy、strncat、strncmp
- 字符串拷貝 strncpy
- 字符串追加拷貝 strncat
- 字符串比較 strncmp
- 4.判斷字符串匹配問題 strstr
- 5.字符操作
- 字符分類函數
- 字符轉換函數
- 二、內存操作函數
- 1.memcpy
- 2.memmove
- 三、庫函數模擬實現
- 1.strlen
- 2.strcpy
- 3.strcat
- 4.strcmp
- 5.memcpy
- 6.memmove
前言
最近在刷題的時候,經常遇到需要用到字符串函數的問題,因此發現對這方面函數使用的一些不足,遂寫一篇博客(筆記),鞏固自身也便復習。
一、字符串函數
1.求字符串長度 strlen
函數定義:
size_t strlen ( const char * str );注意點:
- 字符串已經 ‘\0’ 作為結束標志,strlen函數返回的是在字符串中 ‘\0’ 前面出現的字符個數(不包含 ‘\0’ )。
- 參數指向的字符串必須要以 ‘\0’ 結束。
- 注意函數的返回值為size_t,是無符號的( 易錯 )
2.長度不受限制的字符串函數strcpy、strcat、strcmp
字符串拷貝 strcpy
函數定義:
char* strcpy(char * destination, const char * source );注意點:
- 源字符串必須以 ‘\0’ 結束。
- 會將源字符串中的 ‘\0’ 拷貝到目標空間。
- 目標空間必須足夠大,以確保能存放源字符串。
- 目標空間必須可變。
Strcpy的作用是將一個數組的字符串以覆蓋的方式復制到另一個數組,由于‘\0’也被復制,所以相當于完全拷貝。strcpy會返回一個char型指針,該指針指向被覆蓋的目標字符串的第一個字符的地址。
例如:
以上代碼的結果為:
China China字符串追加拷貝 strcat
函數定義:
char * strcat ( char * destination, const char * source );注意點:
- 源字符串必須以 ‘\0’ 結束。
- 目標空間必須有足夠的大,能容納下源字符串的內容。
- 目標空間必須可修改。
Strcat的用法與strcpy相似,作用是以拼接的方式,將源字符串的內容追加拷貝到目標字符串后面。
例如:
以上代碼的結果為:
AmericaChina字符串比較 strcmp
函數定義:
int strcmp ( const char * str1, const char * str2 );注意點:
- 第一個字符串大于第二個字符串,則返回大于0的數字
- 第一個字符串等于第二個字符串,則返回0
- 第一個字符串小于第二個字符串,則返回小于0的數字
strcmp函數按照ASCII碼來比較兩字符串每一位字符的的大小,直到出現不同的字符or遇到‘\0’為止。當某一個字符串提前結束(遇到‘\0’),那么就算做另一個字符串比較‘大’。
3.長度受限制的字符串函數strncpy、strncat、strncmp
strncpy、strncat、strncmp三個函數的作用與strcpy、strcat、strcmp幾乎完全一樣,唯一不同的是他們多了一個參數,所以這里只給出其函數定義及注意點:
字符串拷貝 strncpy
函數定義
char * strncpy ( char * destination, const char * source, size_t num );注意點:
- 拷貝num個字符從源字符串到目標空間。
- 如果源字符串的長度小于num,則拷貝完源字符串之后,在目標的后邊追加0,直到num個
字符串追加拷貝 strncat
函數定義
char * strncat ( char * destination, const char * source, size_t num );注意點:
- 同strncpy
字符串比較 strncmp
函數定義
int strncmp ( const char * str1, const char * str2, size_t num);注意點:
- 比較到出現另個字符不一樣或者一個字符串結束或者num個字符全部比較完
4.判斷字符串匹配問題 strstr
函數定義
char * strstr ( const char *, const char * );strstr(str1,str2)函數用于判斷字符串str2是否是str1的子串。如果是、則返回str1字符串從str2第一次出現的位置到str1結尾的字符串,否則返回NULL。可以用來1.分割字符串;2.通過查找子串進行刪除,修改等一系列操作。
5.字符操作
字符分類函數
| iscntrl | 任何控制字符 |
| isprint | 任何可打印字符,包括圖形字符和空白字符 |
| isspace | 空白字符:空格‘ ’,換頁‘\f’,換行’\n’,回車‘\r’,制表符’\t’或者垂直制表符’\v’ |
| isgraph | 任何圖形字符 |
| isdigit | 十進制數字 0~9 |
| isxdigit | 十六進制數字,包括所有十進制數字,小寫字母a~f,大寫字母 |
| islower | 小寫字母a~z |
| isupper | 大寫字母A~Z |
| isalpha | 字母az或AZ |
| isalnum | 字母或者數字,az,AZ,0~9 |
| ispunct | 標點符號,任何不屬于數字或者字母的圖形字符(可打印) |
字符轉換函數
int tolower ( int c );//轉換成小寫 int toupper ( int c );//轉換成大寫二、內存操作函數
1.memcpy
函數定義
void * memcpy ( void * destination, const void * source, size_t num );注意點:
- 函數memcpy從source的位置開始向后復制num個字節的數據到destination的內存位置。
- 這個函數在遇到 ‘\0’ 的時候并不會停下來。
- 如果source和destination有任何的重疊,復制的結果都是未定義的(存在內存重疊)。
memcpy與strcpy的區別
2.memmove
函數定義
void * memmove ( void * destination, const void * source, size_t num );注意點:
- 和memcpy的差別就是memmove函數處理的源內存塊和目標內存塊是可以重疊的。
- 如果源空間和目標空間出現重疊,就得使用memmove函數處理。
三、庫函數模擬實現
1.strlen
int my_strlen(char *s) { char *p = s; while(*p != ‘\0’ ) p++; return p-s; }2.strcpy
char *my_strcpy(char *dest, const char*src) { char *ret = dest; assert(dest != NULL);assert(src != NULL); while((*dest++ = *src++)) { ; } return ret; } }3.strcat
char *my_strcat(char *dest, const char*src) { char *ret = dest; assert(dest != NULL); assert(src != NULL); while(*dest) { dest++; } //追加拷貝while((*dest++ = *src++)) { ; } return ret; }4.strcmp
int my_strcmp (const char * src, const char * dst) { int ret = 0 ; assert(src != NULL); assert(dest != NULL); while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst) ++src, ++dst; if ( ret < 0 ) ret = -1 ; else if ( ret > 0 ) ret = 1 ; return( ret ); }5.memcpy
void * memcpy ( void * dst, const void * src, size_t count) { void * ret = dst; assert(dst); assert(src); //從低地址向高地址拷貝while (count--) { *(char *)dst = *(char *)src; dst = (char *)dst + 1; src = (char *)src + 1; } return(ret); }6.memmove
void * memmove ( void * dst, const void * src, size_t count) { void * ret = dst; //如果條件成立,表明向前拷貝不會出現內存重疊現象,采用memcpy相同方法拷貝,反之采用高地址向低地址拷貝if (dst <= src || (char *)dst >= ((char *)src + count)) { while (count--) { *(char *)dst = *(char *)src; dst = (char *)dst + 1; src = (char *)src + 1; } } else { dst = (char *)dst + count - 1; src = (char *)src + count - 1; while (count--) { *(char *)dst = *(char *)src; dst = (char *)dst - 1; src = (char *)src - 1; } } return(ret); }總結
以上是生活随笔為你收集整理的C语言——常见的字符串函数+内存操作函数的介绍及实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux调试——gdb调试器的简单使用
- 下一篇: 计算机视觉——利用openCV与Sock