網站首頁 編程語言 正文
一. strlen(求長度)
size_t? strlen ( const char * str )
函數的返回值類型為size_t,為無符號數,且strlen返回值為字符串中‘\0’前的字符個數。
猜猜這個程序的輸出
if (strlen("abc") - strlen("abcdef")) { printf(">"); } else { printf("<"); }
沒錯,是 >?
因為strlen的返回值為無符號數,-3變成了一個很大的正整數。
二. strcpy(拷貝)
char* strcpy (char * destination, const char * source)
使用時,源字符串必須以\0結尾,并且'\0'也會拷過去
strcpy:"我不管你放不放得下,我就拷。"?
目標地址必須夠大且可修改,不然的話,雖然可以放進去,但是程序會崩潰
strcpy的模擬實現
char* my_strcpy(char* dest,const char* source) { assert(dest && source); char* ret = dest; while (*dest++ = *source++); return ret; }
三.strcat(追加)
char? * strcat ( char * destination , const char * souce)
源字符串必須有'\0',目標字符串也得有'\0'?
追加后,目標空間的'\0'無了,源字符串的'\0'添加上
目標地址必須夠大且可修改
strcat的模擬實現
char* my_strcat(char* dest,char* source) { assert(dest && source); char* ret = dest; while (*dest) { dest++; } while (*dest++ = *source++); return ret; }
四.strcmp
int strcmp(const char* string1, const char * string2)
strcmp函數比較的不是字符串的函數長度`
而是比較字符串中對應位置上的字符的大小,如果相同,就比較下一對字符,知道不同,或者遇到'\0'.
若相同則返回0,若大于則返回大于零的數。若小于則返回小于零的數
strcmp的模擬實現
int my_strcmp(const char* str, const char* qtr) { assert(str && qtr); while (*str == *qtr) { if (*str == '\0') return 0; str++; qtr++; } if (*str > *qtr) return 1; else return -1; }
五.strncpy
char * strncpy ( char * dest, const char * source , size_t count)
作用是將源字符串的前count個字符拷貝到目標字符串
char a[] = "abcd"; char b[] = "qwer"; strncpy(a,b,1);
如以上修改后字符串為qbcd
strncpy的模擬實現
#define _CRT_SECURE_NO_WARNINGS 1 #include<string.h> #include<stdlib.h> #include<stdio.h> void my_strncat(char*dest,char*src,size_t n) { int t = strlen(dest); int f = strlen(src); for (int i = 0; i < n; i++) { *(dest + i) = *src; src++; } } int main() { int n; scanf("%d", &n); char src[50], dest[50]; strcpy(dest, "NICE"); strcpy(src, "SHOOT"); my_strncat(dest,src,n); printf("%s", dest); }
六.strncat
char * strncat ( char * dest , const char * source ,size_t? count)?
作用是將源字符串的前count個字符追加到dest后面、
并且會在結尾加上‘\0’
char arr1[]="abcdef\0xx"; char arr2[]="qwer"; strncat(arr1,arr2,2);
修改后為abcdefqw
strncat的模擬實現
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> #include<assert.h> void my_strncpy(char* str, char* qtr, int size) { assert(str && qtr); int t = strlen(str); for (int i = 0; i < size ; i++) { *(str + t + i) = *qtr; qtr++; } *(str + t + size) = '\0'; } int main() { char src[50], dest[50]; strcpy(src, "A nice"); strcpy(dest, " BOYYYYYYY"); int n = 0; scanf("%d", &n); my_strncpy(src, dest, n); printf("%s", src); }
七.strncmp
int strncm ( const char * str , const char * qtr , size_t num )
指定比較前num個字符,其他同strcmp一樣
八.strstr
const char * strstr ( const char * str1, const char * str2 );
char * strstr ( char * str1, const char * str2 );
用于查找子串,返回第一次找到的地址
?九.strtok
?char * strtok ( char * str , const char * sep)
參數sep是由分隔符組成的一個字符串
str為一個字符串,包含sep中零個或者多個分隔符.
strtok會找到str中第一個分隔符,并把其替換成'\0',返回一個指向這個分隔符的指針
若第一個參數為'\0'',則從上一波保存的位置向后查找另一個分隔符
若字符串中不存在更多的分隔符,則返回NULL指針
char a[] = "A@nice.boy"; char sep[] = "@."; printf("%s", strtok(a, sep)); printf("%s", strtok(NULL, sep));
如以上結果為Anice
char a[] = "A@nice.boy"; const char sep[] = "@."; char arr[30]; char* str = NULL; strcpy(arr, a); for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep)) { printf("%s", str); }
以上輸出為Aniceboy
十.strerror
char * strerror (int errnum )
errno是一個全局變量,記錄最后的錯誤代碼,程序剛剛啟動的時候,errno 被設置為 0;程序在運行過程中,任何一個函數發生錯誤都有可能修改 errno 的值,讓其變為一個非零值,用以告知用戶發生了特定類型的錯誤。
十一.memcpy
void * memcpy ( void* dest , const void * source ,size_t count)
作用是將源字符串的前count個字節拷貝到dest上
int a1[20] = {1,2,3,4,5,6,7,8}; int a2[5] = {0}; memcpy(a1,a2,20);
執行后,a1數組前五個元素變成0
memcpy的模擬實現:
由于memcpy的拷貝是一個字節一個字節進行的
可用以下代碼模擬實現
void* my_memcpy(void* dest, const void* source, size_t count) { assert(source && dest); void* ret = dest; while (count--) { *(char*)dest = *(char*)source; source=(char*)source+1; dest=(char*)dest+1; } return ret; }
十二.memmove
void * memmove (void * dest ,const void * source ,size_t count)
可以實現重疊內存拷貝
模擬實現:
void* my_memmove(void* dest, const void* source, size_t count) { if (dest < source) { while(count--) { *(char*)dest = *(char*)source; dest = (char*)dest + 1; source = (char*)source + 1; } } else { while (count--) { *((char*)dest + count )= *((char*)source + count); } } }
十三.memcmp
void * memcpy ( void * str?, const void * qtr?, size_t count)
比較str和qtr的前count個字節,注意是一個字節一個字節比較
這就很有意思了
請看以下代碼
int a[5] = { 1,2,3,4,5 }; int b[5] = { 1,2,3,4,0x11223305}; memcmp(a,b,16);
很明顯數組的前十六個字節相同,會返回0,但如果是前十七個呢
這是因為? ? ? ?
5存儲為? 05 00 00 00?
0x11223305為???05 33 22 11
十四.memset
void * memset ( void * dest , int c ,size_t count)
作用是將前count個字節改成參數c
int a[]={0,0x22222222}; memset(a,1,8);
如以上a數組變為0x01010101,0x0101010101
原文鏈接:https://blog.csdn.net/m0_63742310/article/details/123607592
相關推薦
- 2022-01-12 修改node_modules的包
- 2024-04-07 MyBatis批量插入的五種方式(推薦MyBatis以集合方式批量新增)
- 2022-09-25 linux命令中cd到路徑報錯
- 2024-02-29 UNI-APP開發之插件安裝失敗,離線安裝
- 2023-07-13 uni-app 導航欄自定義圖標及圖標的點擊事件
- 2022-02-28 nuxt 打包后運行 DOMException: Failed to execute ‘append
- 2023-01-08 Android?Application的使用全面解析_Android
- 2022-06-17 Go語言HttpRouter路由使用方法詳解_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支