C語言之字符串函數

C語言之字符串函數

文章目錄

  • C語言之字符串函數
    • 1. strlen的使用和模擬實現
      • 1.1 strlen的使用
      • 1.2 strlen的模擬實現
    • 2. strcpy的使用和模擬實現
      • 2.1 strcpy的使用
      • 2.2 strncpy的使用
      • 2.3 strcpy的模擬實現
    • 3. strcat的使用和模擬實現
      • 3.1 strcat的使用
      • 3.2 strncat
      • 3.3 strcat的模擬實現
    • 4. strcmp 的使?和模擬實現
      • 4.1 strcmp的使用
      • 4.2 strncmp
      • 4.3 strcmp的模擬實現

1. strlen的使用和模擬實現

? 字符串以 ‘\0’ 作為結束標志,strlen函數返回的是在字符串中 ‘\0’ 前?出現的字符個數(不包含 ‘\0’ )。
? 參數指向的字符串必須要以 ‘\0’ 結束。
? 注意函數的返回值為size_t,是?符號的

1.1 strlen的使用

strlen函數的聲明

size_t strlen ( const char * str );

strlen函數是用來計算字符串的長度的,計算的是 ’ \0 '之前字符的總個數

例子:

#include <stdio.h>
#include <string.h>  //使用strlen需要包含的頭文件
int main()
{char arr[] = "abcdef";strlen(arr);printf("%s\n", arr);return 0;
}

運行結果為 6

sizeof不同的是,sizeof計算的數組中的元素個數包括’ \0 ',詳細可看sizeof和strlen

1.2 strlen的模擬實現

strlen傳一個地址,然后它就會計算’\0’之前字符的總個數,并且返回值是size_t即無符號整型
代碼如下:

#include <stdio.h>
#include <string.h>
#include <assert.h>
size_t my_strlen1(const char* str)//通過計數器的方式
{assert(str != NULL);    //assert斷言,判斷傳入的地址是否為空指針int count = 0;               while (*str != '\0')//str中的內容不為'\0'的時候進入循環{count++;str++;}return count;}
size_t my_strlen2(const char* str)//指針 - 指針 計算的是兩個指針之間的元素個數
{char* start = str;assert(str != NULL);while (*str != '\0'){str++;}return str - start;}
size_t my_strlen3(const char* str) //遞歸的方式
//假設傳入一個字符串"abc"
//遞的過程
//第一次進入函數,*str == a   調用本身1 + my_strlen3("bc")
//第二次進入函數,*str == b   調用本身1 + 1 + my_strlen3("c")
//第三次進入函數,*str == c   調用本身1 + 1 + 1 + my_strlen3(" ")
//第四次進入函數,*str == '\0' ,開始歸
//第四次返回一個0,0 + 1 + 1 + 1
{if (*str == '\0')return 0;elsereturn 1 + my_strlen3(str+1);
}int main()
{char arr[] = "abcdef";size_t len1 =  my_strlen1(arr);size_t len2 =  my_strlen2(arr);size_t len3 =  my_strlen3(arr);printf("%zd\n",len1 );printf("%zd\n",len2 );printf("%zd\n",len3 );return 0;
}

以上為三種strlen的模擬實現,代碼運行如下:
在這里插入圖片描述

2. strcpy的使用和模擬實現

? 源字符串必須以 ‘\0’ 結束。
? 會將源字符串中的 ‘\0’ 拷?到?標空間。
? ?標空間必須?夠?,以確保能存放源字符串。
? ?標空間必須可修改。

2.1 strcpy的使用

函數聲明如下:

char * strcpy ( char * destination, const char * source );

strcpy用來將source中的字符串,拷貝到destination中去

例子:

#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = { "xxxxxxxx"};char arr2[] = "abc";strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}

代碼運行結果如下:
在這里插入圖片描述
在這里插入圖片描述
可以看到strcpy將arr2中的元素拷貝了一份到arr1中,同時在后面加上了一個’\0’,所以abc之后的x不會打印

2.2 strncpy的使用

要想拷貝指定數量的元素可以使用strncpy

函數聲明如下:

char * strncpy ( char * destination, const char * source, size_t num );

strcpy差不多,只是多了一個size_t num這個形參,這個是用來拷貝指定數量的
例子:

#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = { 0 };char arr2[] = "abcdef";strncpy(arr1, arr2,3);printf("%s\n", arr1);return 0;
}

代碼運行結果如下:

在這里插入圖片描述
只會將arr2中前面3個元素拷貝到arr1中

2.3 strcpy的模擬實現

strcpy是用來將兩個數組中下標一致的元素,將source中的字符拷貝到destination中去,一個一個拷貝

代碼如下:

寫法一:

char* my_strcpy(char* dest, char* src)
{char* ret = dest;assert(dest != NULL);assert(src != NULL);while (*src) //當src中的元素不為'\0'時進入循環{*dest = *src;   //將src中的值賦給dest*src++;         //src++,找到下一個元素的地址*dest++;        //dest++,找到下一個元素的地址}*dest = *src;   //由于當src中的元素為'\0'時,循環結束了,'\0'不會賦值到dest中去,使用最后將'\0'賦值給destreturn ret;
}
int main()
{char arr1[20] = { 0 };char arr2[] = "abcdef";my_strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}

寫法二:

```c
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strcpy(char* dest, char* src)
{char* ret = dest;assert(dest != NULL);  //判斷傳入的指針不是空指針assert(src != NULL);while (*dest++ = *src++)// *dest = *src  將src的值拷貝到dest//拷貝完之后,通過指針偏移找到下一個元素//++是先使用后加{//因為只是拷貝元素,while里面不做什么事//使用while必須跟一個語句,使用加上了一個空語句//使用大括號里邊可以不加,但是加上會更清晰一點;}return ret;
}
int main()
{char arr1[20] = { 0 };char arr2[] = "abcdef";my_strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}

3. strcat的使用和模擬實現

? 源字符串必須以 ‘\0’ 結束。
? ?標字符串中也得有 \0 ,否則沒辦法知道追加從哪?開始。
? ?標空間必須有?夠的?,能容納下源字符串的內容。
? ?標空間必須可修改。

3.1 strcat的使用

函數聲明如下:

char * strcat ( char * destination, const char * source );

strcat是將source中的元素追加到destination之后,可以理解為兩個字符串的拼接

例子如下:

#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "hello ";char arr2[] = "world";strcat(arr1, arr2);printf("%s\n", arr1);return 0;
}

3.2 strncat

要想追加指定元素,可以使用strncat
代碼如下:

#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "hello ";char arr2[] = "worldabcdef";strncat(arr1, arr2,5);printf("%s\n", arr1);return 0;
}

運行結果如下:
在這里插入圖片描述
只會將arr2中前五個元素追加到arr1中去,之后的元素則不會追加

3.3 strcat的模擬實現

strcat是先找到destination中的’\0’,然后再其后面開始追加元素
代碼如下:

include <stdio.h>
#include <string.h>
#include <assert.h>char* my_strcat(char* dest, const char* src)
{char* ret = dest;assert(dest && src);while (*dest) //當dest中的元素不為'\0'時,dest++,找到'\0'的位置{dest++;}while (*dest++ = *src++)  //從'\0'之后的位置開始將src中的元素賦值給dest{;}return ret;
}
int main()
{char arr1[20] = "hello ";char arr2[] = "world";my_strcat(arr1, arr2);printf("%s\n", arr1);return 0;
}

4. strcmp 的使?和模擬實現

? 第?個字符串?于第?個字符串,則返回?于0的數字
? 第?個字符串等于第?個字符串,則返回0
? 第?個字符串?于第?個字符串,則返回?于0的數字
? 比較的是兩個元素的ASCII值

4.1 strcmp的使用

函數聲明如下:

int strcmp ( const char * str1, const char * str2 );

比較str1和str2中下標相同元素的ASCII值
如果第一個元素相等時,則比較下一對元素的ASCII值
大于則返回一個大于零的值
小于則返回一個小于零的值
等于則返回零

例子:

#include <stdio.h>
#include <string.h>int main()
{char arr1[] = "abcd";char arr2[] = "abq";int ret = strcmp(arr1, arr2);if (ret > 0)printf("大于\n");else if (ret == 0)printf("等于\n");elseprintf("小于\n");return 0;
}

由于前兩個元素相同,所以比較第三個元素的ASCII值
q的ASCII值大于c的ASCII值
所以會打印小于

4.2 strncmp

可以指定比較的元素個數
代碼如下:

#include <stdio.h>
#include <string.h>int main()
{char arr1[] = "abcd";char arr2[] = "abq";int ret = strncmp(arr1, arr2,2);if (ret > 0)printf("大于\n");else if (ret == 0)printf("等于\n");elseprintf("小于\n");return 0;
}

由于只比較了前兩個元素的ASCII值,前兩個元素相等
所以會打印等于

4.3 strcmp的模擬實現

代碼如下:

#include <stdio.h>
#include <string.h>
#include <assert.h>int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);while (*str1 == *str2){if (*str1 == '\0')return 0;str1++;str2++;}return *str1 - *str2;}
int main()
{char arr1[] = "abcd";char arr2[] = "abq";int ret = my_strcmp(arr1, arr2);if (ret > 0)printf("大于\n");else if (ret == 0)printf("等于\n");elseprintf("小于\n");return 0;
}

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

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

相關文章

C語言--每日五道選擇題--Day23

第一題 1. 已知int i1, j2;&#xff0c;則表達式ij的值為&#xff08; &#xff09; A&#xff1a;1 B&#xff1a;2 C&#xff1a;3 D&#xff1a;4 答案及解析 C 本題考查的是前置和后置的優先級&#xff0c;后置的優先級是高于前置的&#xff0c;所以這個表達式就可以轉變為…

【Spark源碼分析】事件總線機制分析

Spark事件總線機制 采用Spark2.11源碼&#xff0c;以下類或方法被DeveloperApi注解額部分&#xff0c;可能出現不同版本不同實現的情況。 Spark中的事件總線用于接受事件并提交到對應的監聽器中。事件總線在Spark應用啟動時&#xff0c;會在SparkContext中激活spark運行的事件總…

什么是持續集成的自動化測試?

持續集成的自動化測試 如今互聯網軟件的開發、測試和發布&#xff0c;已經形成了一套非常標準的流程&#xff0c;最重要的組成部分就是持續集成&#xff08;Continuous integration&#xff0c;簡稱CI&#xff0c;目前主要的持續集成系統是Jenkins&#xff09;。 那么什么是持…

docker 安裝常用環境

一、 安裝linux&#xff08;完整&#xff09; 目前為止docker hub 還是被封著&#xff0c;用阿里云、騰訊云鏡像找一找版本直接查就行 默認使用latest最新版 #:latest 可以不寫 docker pull centos:latest # 拉取后查看 images docker images #給鏡像設置標簽 # docker tag […

FIB表與快速轉發表工作原理

在一張路由表中&#xff0c;當存在多個路由項可同時匹配目的IP地址時&#xff0c;路由查找進程會選擇掩碼最長的路由項用于轉發&#xff0c;即最長匹配原則。因為掩碼越長&#xff0c;所處的網段范圍就越小&#xff0c;網段的范圍越小&#xff0c;就越能快速的定位到PC機的具體…

【分布式】小白看Ring算法 - 03

相關系列 【分布式】NCCL部署與測試 - 01 【分布式】入門級NCCL多機并行實踐 - 02 【分布式】小白看Ring算法 - 03 【分布式】大模型分布式訓練入門與實踐 - 04 概述 NCCL&#xff08;NVIDIA Collective Communications Library&#xff09;是由NVIDIA開發的一種用于多GPU間…

通過 python 腳本遷移 Redis 數據

背景 需求&#xff1a;需要將的 Redis 數據遷移由云廠商 A 遷移至云廠商 B問題&#xff1a;云版本的 Redis 版本不支持 SYNC、MIGRATE、BGSAVE 等命令&#xff0c;使得許多工具用不了&#xff08;如 redis-port&#xff09; 思路 &#xff08;1&#xff09;從 Redis A 獲取所…

GoLand 2023.2.5(GO語言集成開發工具環境)

GoLand是一款專門為Go語言開發者打造的集成開發環境&#xff08;IDE&#xff09;。它能夠提供一系列功能&#xff0c;如代碼自動完成、語法高亮、代碼格式化、代碼重構、代碼調試等等&#xff0c;使編寫代碼更加高效和舒適。 GoLand的特點包括&#xff1a; 1. 智能代碼補全&a…

json 去除特殊字符換行等符號

由于字符串中有出現了 換行符&#xff0c;導致轉json失敗&#xff0c;報錯&#xff1a;json parse error。 一般來講&#xff0c;直接用string的replace方法就可以了 String str "{\"adrdet\":\"阿歌嘎\n嘎、\",\"date\":\"2023/06/…

Ubuntu安裝CUDA驅動

Ubuntu安裝CUDA驅動 前言官網安裝確認安裝版本安裝CUDA Toolkit 前言 CUDA驅動一般指CUDA Toolkit&#xff0c;可通過Nvidia官網下載安裝。本文介紹安裝方法。 官網 CUDA Toolkit 最新版&#xff1a;CUDA Toolkit Downloads | NVIDIA Developer CUDA Toolkit 最新版文檔&…

NX二次開發UF_CAM_update_list_object_customization 函數介紹

文章作者&#xff1a;里海 來源網站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CAM_update_list_object_customization Defined in: uf_cam.h int UF_CAM_update_list_object_customization(tag_t * object_tags ) overview 概述 This function provids the…

UDP客戶端使用connect與UDP服務器使用send函數和recv函數收發數據

服務器代碼編譯運行 服務器udpconnectToServer.c的代碼如下&#xff1a; #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<arpa/inet.h> #include<sys/socket.h> #include<errno.h> #inclu…

Okhttp 淺析

安全的連接 OkHttpClient: OkHttpClient: 1.線程調度 2.連接池,有則復用,沒有就創建 3.interceptor 4.interceptor 5.監聽工廠 6.是否失敗重試 7.自動修正訪問,如果沒有權限或認證 8是否重定向 followRedirects 9.協議切換時候是否繼續重定向 10.Cookie jar 容器 默認…

Python 的 socket 模塊套接字編程(簡單入門級別)

Python 的 socket 模塊提供了對套接字編程的支持&#xff0c;允許你在網絡上進行數據傳輸。套接字是一個抽象的概念&#xff0c;它允許程序在網絡中的不同節點之間進行通信。 下面是 socket 模塊中一些常用的函數和類&#xff1a; 1. 創建套接字&#xff1a; socket.socket(…

pycharm 創建的django目錄和命令行創建的django再使用pycharm打開的目錄對比截圖 及相關

pytcharm創建django的項目 命令行創建的django 命令行創建項目時 不帶路徑時 (.venv) D:\gbCode>django-admin startproject gbCode 命令行創建項目時 帶路徑時 -- 所以如果有目錄就指定路徑好 (.venv) D:\gbCode>django-admin startproject gbCode d:\gbCode\

洛谷P1219 [USACO1.5] 八皇后【n皇后問題】【深搜+回溯 經典題】【附O(1)方法】

P1219 [USACO1.5] 八皇后 Checker Challenge 前言題目題目描述輸入格式輸出格式樣例 #1樣例輸入 #1樣例輸出 #1 提示題目分析注意事項 代碼深搜回溯打表 后話額外測試用例樣例輸入 #2樣例輸出 #2 王婆賣瓜 題目來源 前言 也是說到做到&#xff0c;來做搜索的題&#xff08;雖…

微機原理_2

一、單項選擇題(本大題共15小題,每小題3分,共45分。在每小題給出的四個備選項中,選出一個正確的答案&#xff0c;請將選定的答案填涂在答題紙的相應位置上。&#xff09; 下列數中最大的數為&#xff08;&#xff09; A. 10010101B B. (126)8 C. 96H D. 100 CPU 執行 OUT 60H,…

Android 9.0 隱藏設置顯示中自動調節亮度

Android 9.0 隱藏設置顯示中自動調節亮度 最近收到郵件需求提到想要隱藏設置顯示中的自動調節亮度&#xff0c;具體修改參照如下&#xff1a; /vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/display_settings.xml - <Preference<!--Preferencea…

西門子(Siemens)仿真PLC啟動報錯處理

目錄 一、背景&#xff1a; 二、卸載軟件 三、安裝軟件 三、啟動軟件 四、下載PORTAL項目 五、測試 一、背景&#xff1a; 在啟動S7-PLCSIM Advanced V3.0仿真PLC時報錯&#xff0c;報錯信息為&#xff1a;>>Siemens PLCSIM Virtual Switch<<is misconfigu…

Ubuntu 23.10 服務器版本 ifconfig 查不到網卡 ip(已解決)

文章目錄 1、問題描述2、 解決方案 1、問題描述 服務器&#xff1a;ubuntu 23.10 經常會遇到虛擬機添加僅主機網卡后&#xff0c;通過 ifconfig 無法獲取其網卡 ip 2、 解決方案 修改網卡配置文件&#xff1a; # 進入網卡配置文件目錄 cd /etc/netplan # 備份原始文件 cp …