【C語言】字符/字符串+內存函數

目錄

Ⅰ、字符函數和字符串函數

????????1?.strlen

????????2.strcpy

????????3.strcat

????????4.strcmp

????????5.strncpy

????????6.strncat

????????7.strncmp

????????8.strstr

????????9.strtok

????????10.strerror

????????11.字符函數?

????????12. 字符轉換函數

Ⅱ、內存函數

? ? ? ? ?1 .memcpy

????????2.memmove

????????3.memcmp


Ⅰ、字符函數和字符串函數

????????1?.strlen

函數原型:

注意事項:

1.字符串以 ?'\0' 作為結束標志 strlen 函數返回的是在字符串中 '\0' 前面 出現的字符個數( 不包含 '\0' )
2.參數指向的字符串 必須要以 '\0' 結束
3.注意函數的 返回值 size_t ,是無符號的( 易錯
4.學會 strlen 函數的模擬實現

模擬實現:三種方法(計數器,遞歸,指針-指針

//模擬實現strlen
//方法一:計數器
size_t my_strlen1(const char* str)
{char* st = str;size_t count = 0;while (*st++){count++;}return count;
}
//方法二:遞歸
size_t my_strlen2(const char* str)
{if (*str == '\0')return 0;return 1 + my_strlen2(++str);//注意這里不能用   后置++
}
//方法三:指針-指針
size_t my_strlen3(const char* str)
{char* st = str;while (*st != '\0'){//printf("%p\n", str);//  從小地址往大地址編址st++;}return st-str;
}

????????2.strcpy

函數原型:

注意事項:

1.Copies the C string pointed by source into the array pointed by destination, including the
terminating null character (and stopping at that point).
2.源字符串 必須以 '\0' 結束
3.會將 源字符串 中的 '\0' 拷貝到 目標空間
4.目標 空間必須足夠大 ,以確保能存放源字符串。
5.目標 空間必須可變
6.學會模擬實現。

模擬實現:

//模擬實現strcpy
char* my_strcpy(char* dest, const char* src)
{assert(dest && src);char* cur = src; char *re = dest;while (*dest++ = *src++);return re;
}

????????3.strcat

函數原型:

注意事項:

1.Appends a copy of the source string to the destination string. The terminating null character
in destination is overwritten by the first character of source, and a null-character is included
at the end of the new string formed by the concatenation of both in destination.
2.源字符串 必須以 '\0' 結束
3.目標 空間 必須有 足夠 的大,能容納下源字符串的內容。
4.目標空間必須 可修改
5.字符串自己給自己追加,如何?不能,可能會 非法訪問

模擬實現:

//模擬實現strcat
char* my_strcat(char* dest, const char* src)
{assert(dest&&src);char* ret = dest;while (*dest != '\0')dest++;char* sr = src;while (*dest++ = *sr++);return ret;
}

????????4.strcmp

函數原型:

注意事項:

1.This function starts comparing the first character of each string. If they are equal to each
other, it continues with the following pairs until the characters differ or until a terminating
null-character is reached.
標準規定:
1.第一個字符串大于第二個字符串,則返回 大于0 的數字
2.第一個字符串等于第二個字符串,則返回 0
3.第一個字符串小于第二個字符串,則返回 小于0 的數字

模擬實現:

//模擬實現strcmp
int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);while (*str1 == *str2){if (*str1 == '\0')return 0;str1++;str2++;}if (*str1 < *str2)return -1;elsereturn 1;
}

????????5.strncpy

函數原型:

注意事項:

1.Copies the first num characters of source to destination. If the end of the source C string
(which is signaled by a null-character) is found before num characters have been copied,
destination is padded with zeros until a total of num characters have been written to it.
2.拷貝 num個字符 字符串到 目標空間
3.如果源字符串的長度 小于num ,則拷貝完源字符串之后,在目標的后邊 追加0 ,直到 num

?簡單使用;

//使用strncpy
int main()
{char buf[128] = "xxxxxxxxxxxxxxxxxxxxxxxxxxx";char* str = "abcdef";printf("%s\n", strncpy(buf, str,7 ));//沒有超過就是n為多大就拷貝幾個過去,//n如果超過了字符串的長度后面就進行補 '\0'return 0;
}

執行結果:

?

????????6.strncat

函數原型:

注意事項:

1.Appends the first num characters of source to destination, plus a terminating null-character.
2.If the length of the C string in source is less than num, only the content up to the terminating null-character is copied
3.如果 空間 不夠,要報錯
4.如果num比源字符串長,則緊追加 NULL之前 的字符

簡單使用:

//使用strncat
int main()
{char buf[128]="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";buf[10] = '\0';		//從第一個'\0'開始拼接buf[20] = '\0';char* str = "abcdef";printf("%s", strncat(buf, str, 5));return 0;
}

執行結果:

?

????????7.strncmp

函數原型:

注意事項:

比較到出現另個字符不一樣或者一個字符串結束或者num個字符全部比較完。

簡單使用:

/* strncmp example */
int main()
{char str[][5] = { "R2D2" , "C3PO" , "R2A6" };int n;puts("Looking for R2 astromech droids...");for (n = 0; n < 3; n++)if (strncmp(str[n], "R2xx", 2) == 0){printf("found %s\n", str[n]);}return 0;
}

?執行結果:

????????8.strstr

函數原型:

注意事項:

Returns a poin ter to the first occurrence of str2 in str1, or a null pointer if str2 is not part of
str1.

模擬實現:

//strstr的模擬實現
char* my_strstr(const char* str1, const char* str2)
{while (*str1){if (*str1 == *str2){char* s1 = str1; char* s2 = str2;while (*s1 && *s2 && (*s1 == *s2)){s1++;s2++;}if (*s2 == '\0')return str1;}str1++;}
}

????????9.strtok

函數原型:

注意事項:

1.sep 參數是個字符串,定義了用作 分隔符的字符集合
2.第一個參數指定一個字符串,它包含了 0個或者多個由sep字符串中一個或者多個分隔符 分割的標記。
3.strtok 函數 找到str中的下一個標記 ,并將其用 \0 結尾 ,返回一個指向這個 標記的指針
(注strtok函數會 改變被操作的字符串 ,所以在使用 strtok 函數切分的字符串一般都是 臨時拷貝的內容并且可修改 。)
4.strtok 函數的 第一個參數不為 NULL ,函數將找到 str 中第一個標記, strtok 函數將 保存它在字符串中的位置
5.strtok 函數的 第一個參數為 NULL ,函數將在同一個字符串中被 保存的位置開始 ,查找下一個標記。
6.如果字符串中 不存在更多的標記 ,則 返回 NULL 指針

簡單使用:

//strtok使用
int main()
{char str[128] = "hyd@qwer.com.cn.edu.com";//注意這里必須是可修改的字符串,常量不能修改char* sep = "@.";char* ret = strtok(str, "@.");printf("%s\n", ret);while(ret=strtok(NULL,sep))printf("%s\n", ret);return 0;
}

執行結果:

?

????????10.strerror

函數原型:

注意事項:

返回錯誤碼(errno),所對應的錯誤信息。

簡單使用:

//使用strerror
int main()
{FILE* fp = fopen("data.txt", "r");if (fp == NULL){//printf("打開失敗:%s\n", strerror(errno));//打印錯誤信息perror("打開失敗");//類似于 printf+錯誤原因}elseprintf("文件打開成功\n");return 0;
}

執行結果:

????????11.字符函數?

函數 如果他的參數符合下列條件就返回真(非0)
iscntrl ????????任何控制字符(1-31是控制字符,32-127是可打印字符)
isspace ?????空白字符:空格‘ ’,換頁 ‘\f’ ,換行 '\n' ,回車 ‘\r’ ,制表符 '\t' 或者垂直制表符 '\v'
isdigit ????????十進制數字 0~9
isxdigit ??????十六進制數字,包括所有十進制數字,小寫字母a~f,大寫字母 A~F
islower ??????小寫字母a~z
isupper ?????大寫字母A~Z
isalpha? ? ? ?字母a~z A~Z
isalnum? ? ? 字母或者數字,a~z,A~Z,0~9
ispunct? ? ? ?標點符號,任何不屬于數字或者字母的圖形字符(可打印)
isgraph? ? ? ?任何圖形字符
isprint? ? ? ? ?任何可打印字符,包括圖形字符和空白字符

????????12. 字符轉換函數

int tolower ( int c );
int toupper? ( int c );

簡單使用:

/* isupper example */
#include <stdio.h>
#include <ctype.h>
int main ()
{int i=0;char str[]="Test String.\n";char c;while (str[i]){c=str[i];if (isupper(c)) c=tolower(c);putchar (c);i++;}return 0;
}

?執行結果:

Ⅱ、內存函數

? ? ? ? ?1 .memcpy

函數原型:

注意事項:

1.函數 memcpy source 的位置開始向后復制 num 個字節的數據到 destination 的內存位置。
2.這個函數在遇到 '\0' 的時候并不會停下來。
3.如果 source destination 有任何的重疊,復制的結果都是未定義的。

模擬實現:

//模擬實現memcpy
char* my_memcpy(void* dest, const void* src,size_t sz)
{assert(dest && src);char* ret = dest;while (sz--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}return ret;
}

????????2.memmove

函數原型:

注意事項:

1.和 memcpy 的差別就是 memmove 函數處理的源內存塊和目標內存塊是可以重疊的。
2.如果源空間和目標空間出現重疊,就得使用 memmove 函數處理。

模擬實現:

//char* my_memmove(void* dest, const void* src, size_t sz)
{assert(dest && src);char* ret = (char*)dest;if (dest < src){while(sz--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}}else{while (sz--){*((char*)dest + sz) = *((char*)src + sz);}}
}

????????3.memcmp

函數原型:

注意事項;

1.比較從 ptr1 ptr2 指針開始的 num 個字節
2.返回值如下:

簡單使用:

int main()
{int arr1[] = { 1,2,3,4,5,6,7 };//01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00 06 00 00 00 07 00 00 00//int arr2[] = { 1,2,3,0x11223304 };//01 00 00 00 02 00 00 00 03 00 00 00 04 33 22 11int ret = memcmp(arr1, arr2, 13);printf("%d\n", ret);return 0;
}

執行結果:0?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/35842.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35842.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/35842.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《計算機英語》 Unit 6 Internet 互聯網

Section A Internet 互聯網 The Internet is a global system of interconnected computer networks that use the standard Internet protocol suite (TCP/IP) to link several billion devices worldwide. 互聯網是一個全球性的互連計算機網絡系統&#xff0c;使用標準的互聯…

python多線程加速web服務

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、代碼實現&#xff1f;1.引入庫2.讀入數據 總結 前言 提示&#xff1a;這里可以添加本文要記錄的大概內容&#xff1a; 1 提示&#xff1a;以下是本篇文章…

15、Spring~容器啟動過程

15、Spring~容器啟動過程 容器啟動過程AnnotationConfigApplicationContext類的四個構造器&#xff1a;啟動過程詳解無參構造方法refresh()方法prepareRefresh()方法prepareBeanFactory()方法invokeBeanFactoryPostProcessors()方法registerBeanPostProcessors()方法finishBean…

蘋果CMS-V10 搭建教程踩坑,跳過部分驗證

我突發奇想,想要安裝一個CMS 蘋果CMS搭建教程-CSDN博客 然后就有了下面的問題 結論是zip相關依賴未安裝, 通過 apt install php-zip, 重新打開安裝頁面,同樣如此 最后依據某個網站提示,修改 "\\192.168.1.200\root\var\www\html\maccms\application\install\control…

JSR 303全解析:如何在Java項目中實施高效數據校驗

1. JSR 303是什么&#xff1f; JSR 303&#xff08;Java Specification Request 303&#xff09;&#xff0c;也稱為Bean Validation&#xff0c;是Java中的一個規范&#xff0c;用于定義Java對象的校驗規則。 1.1 JSR 303的主要功能 注解驅動&#xff1a;通過注解直接在Jav…

多家國產大模型提供OpenAI API服務替代方案,谷歌將推出明星網紅AI聊天機器人

ChatGPT狂飆160天&#xff0c;世界已經不是之前的樣子。 更多資源歡迎關注 1、OpenAI終止對中國提供服務 6月25日凌晨&#xff0c;多個用戶收到OpenAI的推送郵件&#xff0c;信中稱&#xff0c;自今年7月9日起&#xff0c;將開始阻止來自非支持國家和地區的API&#xff08;應…

3.任務的創建與刪除

1.什么是任務&#xff1f; 任務可以理解為進程/線程&#xff0c;創建一個任務&#xff0c;就會在內存開辟一個空間。 任務通常都含有while(1)死循環 2.任務創建與刪除相關的函數 3.CUBEMAX相關配置 編輯一個led1閃爍的任務

小程序使用echarts和echarts配置項總結(全網最簡單詳細)

文章目錄 概要小程序中使用echarts1. ec-canvas2. 下載項目3. 去echarts官網定制&#xff1a;4.點擊下載5.引入使用 echarts的option配置知識點歸納整理&#xff08;還在更新&#xff09;&#xff1a;小結 概要 小程序中使用echarts&#xff08;簡單詳細&#xff09; 小程序中…

解密城市酷選為何異軍突起!打造消費新潮流的排隊免單模式

一、城市酷選平臺簡介 在數字化浪潮席卷全球的今天&#xff0c;城市酷選作為一個前沿的消費平臺&#xff0c;憑借其獨特的排隊免單模式&#xff0c;成功吸引了眾多消費者和商家的目光。該平臺不僅整合了線上線下的資源&#xff0c;更通過數字化手段&#xff0c;為消費者提供了…

云計算 | 期末梳理(中)

1. 經典虛擬機的特點 多態(Polymorphism):支持多種類型的OS。重用(Manifolding):虛擬機的鏡像可以被反復復制和使用。復用(Multiplexing):虛擬機能夠對物理資源時分復用。2. 系統接口 最基本的接口是微處理器指令集架構(ISA)。應用程序二進制接口(ABI)給程序提供使用硬件資源…

C3P0數據庫連接池

目錄 一&#xff1a;連接池介紹 1.1連接池解決的問題 2.常用的數據庫連接池 二&#xff1a;c3p0介紹 2.1C3P0介紹&#xff1a; 2.2C3P0快速入門 1.常用參數說明 2.API介紹 3.使用步驟 1.導入jar包c3p0-0.9.1.2.jar 2.編寫c3p0-config.xml配置文件&#xff0c;配置對…

Python 中字符串修飾符

1. 原始字符串 (Raw String) - r 或 R 使用 r 或 R 前綴&#xff0c;可以告訴 Python 字符串中的所有反斜杠都是普通字符&#xff0c;而不是轉義字符。這在處理文件路徑、正則表達式等情況下非常有用。 path rC:\new_folder\test.txt # 原始字符串2. 格式化字符串 (Formatt…

第十九條:要么為繼承而設計并提供文檔說明,要么就禁止繼承

在前面一條中&#xff0c;我們已經知道了David寫了A類被Tom拿去繼承了&#xff0c;導致了A類的封裝性遭到了破壞&#xff0c;那么有沒有可能做點事情避免此事發生呢&#xff1f;第十九條孕育而生&#xff01;David在創建A類的時候寫上文檔說明&#xff0c;說Al類不允許任何類來…

node 實現導出, 在導出excel中包含圖片(附件)

如果想查看 node mySql 實現數據的導入導出&#xff0c;以及導入批量插入的sql語句&#xff0c;連接如下 node mySql 實現數據的導入導出&#xff0c;以及導入批量插入的sql語句-CSDN博客https://blog.csdn.net/snows_l/article/details/139998373 一、效果如圖&#xff1a; 二…

中介子方程三十四

XXFXXuXXWXXuXXdXXrXXαXXuXpXXKXηXiXXαXXiXηXKXXpXuXXαXXrXXdXXuXWXπXXWXeXyXeXbXπXpXXNXXqXeXXrXXαXXuXpXXKXηXiXXαXXiXηXKXXpXuXXαXXrXXeXqXXNXXpXπXbXeXyXeXWXXπXWXuXXdXXrXXαXXuXpXXKXηXiXXαXXiXηXKXXpXuXXαXXrXXdXXuXXWXXuXXFXXEXXyXXEXXrXXαXXuXpXXK…

paraview跨節點并行渲染

參考&#xff1a; https://cloud.tencent.com/developer/ask/sof/101483588 ParaView 支持使用其內置的網絡拓撲來進行跨節點的并行渲染。以下是一個簡單的步驟來設置和運行跨節點的并行渲染&#xff1a; 確保你的計算環境支持多節點計算&#xff0c;比如通過SSH、MPI或其他集…

阿里云擴容

官網&#xff1a;https://help.aliyun.com/zh/ecs/user-guide/extend-the-partitions-and-file-systems-of-disks-on-a-linux-instance?spm5176.ecs-console-storage_disk.help.dexternal.72d24df5QOL4ss 博客&#xff1a;http://t.csdnimg.cn/cUykr

Android APP通過View修改鼠標樣式

app view上修改鼠標樣式比較簡單&#xff0c;使用如下方法修改為自定義圖片&#xff1a; getWindow().getDecorView().setPointerIcon(PointerIcon.load(getResources(), R.drawable.pointer_spot_touch_icon)); 設置鼠標樣式setPointerIcon的調用棧 frameworks/base/core/jav…

C語言:流量控制

前言 流量控制可以讓發送端根據接收端的實際接受能力控制發送的數據量。它的具體操作是&#xff0c;接收端主機向發送端主機通知自己可以接收數據的大小&#xff0c;于是發送端會發送不會超過該大小的數據&#xff0c;該限制大小即為窗口大小&#xff0c;即窗口大小由接收端主…

【Linux詳解】進程的狀態 | 運行 阻塞 掛起 | 僵尸和孤兒狀態

目錄 操作系統中 運行狀態 阻塞狀態 進程狀態轉換 Linux系統中 查看進程狀態 深度睡眠狀態 T 暫停狀態 Z 僵尸狀態 孤兒狀態 文章手稿 xmind: 引言 介紹系統中的進程狀態及其管理方式。將通過結合操作系統原理和實際代碼示例&#xff0c;詳細說明進程的各種狀態、轉換…