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