網(wǎng)站首頁 編程語言 正文
字符串函數(shù)
長度不受限制的字符串函數(shù)
strlen
size_t strlen ( const char * str )
求字符串長度:
字符串以'\0' 作為結(jié)束標志,strlen函數(shù)返回的是在字符串中 '\0' 前面出現(xiàn)的字符個數(shù)(不包含 '\0' )
參數(shù)指向的字符串必須要以 '\0' 結(jié)束
注意函數(shù)的返回值為size_t,是無符號的
例子如下:計算Hello World! 的字符數(shù)
strcpy
char* strcpy(char * destination, const char * source )
用法:將 source 指向的 C 字符串復制到 destination 指向的數(shù)組中,包括終止空字符(并在該點停止)
注意:
源字符串必須以 '\0' 結(jié)束。
會將源字符串中的 '\0' 拷貝到目標空間。
目標空間必須足夠大,以確保能存放源字符串。
目標空間必須可變
strcpy的實現(xiàn):
char * strcpy(char *dest, const char*src)
{
char *ret = dest;//記錄下字符串dest的起始地址
assert(dest != NULL);
assert(src != NULL);
while((*dest++ = *src++))//copy
{
;
}
return ret;//返回起始地址
}
strcat
char * strcat ( char * destination, const char * source )
用法:將源字符串的副本附加到目標字符串。也就是將src字符串接在dest的字符串后面,并且src字符串的第一個字符覆蓋dest的最后一個字符(\0),并且在接好的字符串后加上'\0'
注意:
源字符串必須以 '\0' 結(jié)束。
目標空間必須有足夠的大,能容納下源字符串的內(nèi)容。
目標空間必須可修改。
strcat的實現(xiàn):
char * strcat(char *dest, const char*src)
{
char *ret = dest;
assert(dest != NULL);
assert(src != NULL);
//找到目標空間
while(*dest)
{
dest++;
}
//拷貝
while((*dest++ = *src++))
{
;
}
return ret;
}
strcmp
int strcmp ( const char * str1, const char * str2 )
用法:此函數(shù)開始比較每個字符串的第一個字符。如果它們等于每個其他,它會繼續(xù)以下對,直到字符不同或終止達到空字符。
注意:
第一個字符串大于第二個字符串,則返回大于0的數(shù)字
第一個字符串等于第二個字符串,則返回0
第一個字符串小于第二個字符串,則返回小于0的數(shù)字
strcmp的實現(xiàn):
?int strcmp(const char* st1, const char* st2)
{
int ret = 0;
while (*st1 == *st2)
{
st1++;
st2++;
if(*st1 == *st2 && *st1 == '\0')
return ret;//相等的時候返回0
}
return *st1 - *st2;
長度受限制的字符串函數(shù)介紹
strncpy
拷貝num個字符從源字符串到目標空間。
如果源字符串的長度小于num,則拷貝完源字符串之后,在目標的后邊追加0,直到num個。
strncat
將源的前 num 個字符附加到目標,加上一個終止空字符。
如果 source 中 C 字符串的長度小于 num,則只有到終止符的內(nèi)容空字符被復制
strncmp
比較到出現(xiàn)另個字符不一樣或者一個字符串結(jié)束或者num個字符全部比較完。
字符串查找以及錯誤報告
strstr
char * strstr ( const char *str1, const char * str2)
返回指向 str1 中第一次出現(xiàn) str2 的指針,如果 str2 不屬于字符串str1就返回空指針
strstr的實現(xiàn):
char* strstr(const char* st1, const char* st2)
{
//st1,st2標注起始位置
char* s1 = st1;
char* s2 = st2;
char* cur = s1;
while (*cur)
{
s1 = cur;
while (*s1 == *s2 && *s1 && *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return cur;
}
cur++;
}
return NULL;//找不到
}
strtok
用法:根據(jù)給出的字符將字符串分隔開
char * strtok ( char * str, const char * sep )
sep參數(shù)是個字符串,定義了用作分隔符的字符集合
第一個參數(shù)指定一個字符串,它包含了0個或者多個由sep字符串中一個或者多個分隔符分割的標
記strtok函數(shù)找到str中的下一個標記,并將其用 \0 結(jié)尾,返回一個指向這個標記的指針。(注:
strtok函數(shù)會改變被操作的字符串,所以在使用strtok函數(shù)切分的字符串一般都是臨時拷貝的內(nèi)容
并且可修改。)
strtok函數(shù)的第一個參數(shù)不為 NULL ,函數(shù)將找到str中第一個標記,strtok函數(shù)將保存它在字符串
中的位置。
strtok函數(shù)的第一個參數(shù)為 NULL ,函數(shù)將在同一個字符串中被保存的位置開始,查找下一個標
記。
如果字符串中不存在更多的標記,則返回 NULL 指針
這里演示一下:
strerror
char * strerror ( int errnum )
返回錯誤碼,所對應的錯誤信息
這里頭文件為#include<errno.h>
演示如下;
內(nèi)存操作函數(shù)
memcpy
void * memcpy ( void * destination, const void * source, size_t num )
用法:函數(shù)memcpy從source的位置開始向后復制num個字節(jié)的數(shù)據(jù)到destination的內(nèi)存位置。
這個函數(shù)在遇到 '\0' 的時候并不會停下來。
如果source和destination有任何的重疊,復制的結(jié)果都是未定義的。
memcpy的實現(xiàn):
?void* memcpy(void* dest, const void* src, size_t sz)
{
assert(dest && src);
void* ret = dest;
int count = sz;
while (count--)
{
*(char*)dest = *(char*)src;//拷貝
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
memmove
void * memmove ( void * destination, const void * source, size_t num )
用法:和memcpy的用法差不多,和memcpy的差別就是memmove函數(shù)處理的源內(nèi)存塊和目標內(nèi)存塊是可以重疊的。
如果源空間和目標空間出現(xiàn)重疊,就得使用memmove函數(shù)處理
memmove的實現(xiàn):
void* memmove(void* dest, const void* src, size_t sz)
{
assert(dest && src);//斷言
int* ret = dest;
int count = sz;
if (*(char*)dest > *(char*)src && *(char*)dest < *(char*)src + count)
{
//后->前
while (count--)
{
*((char*)dest + count) = *(char*)src + count;
}
}
else
{
//前->后
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
return ret;
}
memcmp
int memcmp ( const void * ptr1,const void * ptr2,size_t num )
用法:比較從ptr1和ptr2指針開始的num個字節(jié)
返回值:
原文鏈接:https://blog.csdn.net/m0_56653788/article/details/123837360
相關(guān)推薦
- 2022-07-21 react中的redux
- 2023-01-26 redis慢查詢?nèi)罩镜脑L問和管理方式_Redis
- 2022-06-01 idea對CPU的占用率過大問題的解決方法_相關(guān)技巧
- 2022-11-14 Windows進程的創(chuàng)建與結(jié)束
- 2022-05-31 Python中的變量及簡單數(shù)據(jù)類型應用_python
- 2023-10-10 微信授權(quán)與拒絕授權(quán)的彈窗處理
- 2022-10-05 matplotlib之Pyplot模塊繪制三維散點圖使用顏色表示數(shù)值大小_python
- 2023-05-09 Oracle中分割字符串的方法實例代碼_oracle
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支