C語言(字符和字符串函數)2

?????????Hi~!這里是奮斗的小羊,很榮幸各位能閱讀我的文章,誠請評論指點,歡迎歡迎~~? ? ?

????????????????????????????????????????????????💥個人主頁:小羊在奮斗

????????????????????????????????????????????????💥所屬專欄:C語言? ?

????????本系列文章為個人學習筆記,在這里撰寫成文一為鞏固知識,二為一些學友們展示一下我的學習過程及理解。文筆、排版拙劣,望見諒。?

????????????????????????????????6、strcmp 的使用和模擬實現

????????????????????????????????7、strncpy、strncat 和 strncmp

????????????????????????????????8、strtok 的使用和模擬實現

????????????????????????????????9、strstr 的使用和模擬實現

????????????????????????????????10、strerror 函數的使用

6、strcmp 的使用和模擬實現

? ? ? ? 6.1 strcmp 的用法

? ? ? ? 其實對于 strcmp 函數我們并不陌生,在之前的學習中已經不止一次用到過。

????????strcmp 函數的作用是比較兩個字符串的大小,當結果是大于時返回一個正值,小于時返回一個負值,等于時返回0。所以 strcmp 函數的返回值是int類型,我們在使用字符串函數的時候一定要清楚每個函數的返回值是什么。

????????要特別注意的是,strcmp 函數比較兩個字符串比較的不是字符串的長度,而是對應位置字符的ASCII碼值。?

? ? ? 可以看到,當對應位置字符的ASCII碼值前者大于后者時,strcmp 函數返回了1;當小于時,strcmp 函數返回了-1;當等于時,strcmp 函數返回了0。來看下面代碼示例:

? ? ? ? 這個代碼有沒有什么問題呢?其實,上面的代碼在VS中是沒有任何問題的,但是在其他編譯器中可能就會發生錯誤。其中的原因在 strcmp 函數的返回值上,我們說當前面的字符串大于后面的字符串時返回一個正值,但這個正值可以是任意正值,而在VS上規定這個正值為1,但是在其他編譯器上并不見得這個正值都為1。

? ? ? ? 6.2 strcmp 的模擬實現

? ? ? ? 有了前幾個模擬實現字符串函數的經驗,模擬 strcmp 函數難度也不是太大。?

#include <stdio.h>
#include <assert.h>int my_strcmp(const char* str1, const char* str2)
{assert(str1 != NULL);assert(str2 != NULL);while (*str1 == *str2){if (*str1 == '\0'){return 0;}str1++;str2++;}if (*str1 > *str2){return 1;}else{return -1;}
}int main()
{char str1[] = "abcdef";char str2[] = "abcijk";int ret = my_strcmp(str1, str2);printf("%d\n", ret);return 0;
}

? ? ? ? 特別的,還可以簡化成下面的形式。

7、strncpy、strncat 和 strncmp

? ? ? ? 出了 strcpy、strcat 和 strcmp 外,C語言還提供了更加靈活的 strncpy、strncat 和 strncmp,它們算是前三者的升級版,使用起來更加靈活。以 strncpy 為例:

? ? ? ? 可以看到 strncpy 相較于 strcpy 多了一個參數,用于指定拷貝多少個字符。另外兩個也是類似。

? ? ? ? 雖然它們的邏輯表面上看起來是一樣的,但是 strcnpy 和 strncat 之間還是有一點差異的

?

?

? ? ? ? 可以看到 strncpy 不會給目標字符串主動添加 ‘\0’,但 strncat 就會主動給目標字符串添加 ‘\0’,這是兩個函數間的差異。?

? ? ? ? 那既然有了 strncat 函數,我們就能彌補上一小節中未能實現字符串自己拼接到自己后面的遺憾了。

8、strtok 函數的使用??????

? ? ? ? 更多詳細介紹請跳轉閱讀 —>?strtok, strtok_s - cppreference.com? ?

? ? ? ? ?看了上面的介紹好像還是云里霧里的,我用通俗的話來解釋一下。delim 指向一個字符串,定義了用作分隔符的字符集合;第一個參數指定一個字符串,它包含了0個或多個由delim字符串中的一個或多個分隔符分割的標記;strtok 函數找到str中的下一個標記,并將其用\0結尾,返回一個指向這個標記的指針(strtok 函數會改變被操作的字符串,所以被 strtok 函數切分的字符串一般都是臨時拷貝的內容并且可修改);strtok 函數的第一個參數不為NULL,函數將找到str中第一個標記,strtok 函數將保存它在字符串中的位置;strtok 函數的第一個參數為NULL,函數將在同一個字符串中被保存的位置開始,查找下一個標記;如果字符串中不存在更多標記,則返回NULL指針。也就是說,只需要傳遞一次指向字符串的非空指針,剩下的都傳空指針。

????????上面的描述其實說的是? strtok 函數是一個過濾指定字符,提取出你想要的部分的函數。比如,有一個郵箱地址?18655404590@163.com,我們想要剔除其中的特殊字符 ‘@’ 和 ‘.’ ,提取出18655404590、163和com,那我們就可以使用 strtok 函數來實現。其中字符指針str指向目標字符串“18655404590@163.com”,delim 指向指定的分隔符“@、.”。

? ? ? ? 但是,上面是我們事先知道字符串中有兩個分隔符,所以寫了三個打印函數,那如果我們不知道一個字符串中有多少個分隔符呢?這里可以用for循環來解決,之前我們在介紹for循環的文章中說過這么一句話,for循環通常用來解決循環次數未知的情況。

?

?9、strstr 的使用和模擬實現

? ? ? ? 9.1 strstr 的使用

? ? ? ? 更多詳細介紹請跳轉閱讀 —>?strstr - cppreference.com? ? ? ??? ? ? ? 簡單來說,strstr 函數的作用是在一個字符串中查找另一個字符串,找到了就返回這個字符串第一次出現的起始地址,沒找到就返回一個空指針。來看示例:

? ? ? ? 9.2 strstr 的模擬實現

? ? ? ? 模擬實現 strstr 函數之前,我們需要想清楚怎么在一個字符串中找另一個字符串是否存在呢?容易想到的是兩個字符串通過指針解引用來一個一個的比較來判斷是否存在一個相同的字符串,大致思路如下:

? ? ? ? (1)逐個字符地訪問被查找的字符串,當訪問到與目標字符串首字符相同的字符時記住這個可能的地址,方便后面返回;

? ? ? ? (2)當兩個字符串的字符兩兩比較一直到目標字符串訪問到 ‘\0’ 時說明找到了,返回之前記住的地址;

? ? ? ? (3)當被查找的字符串訪問到 ‘\0’ 時說明被查找的字符串不存在,返回一個空指針;

? ? ? ? (4)綜上,需要創建三個指針,其中兩個指向被查找字符串,一個用來逐個訪問字符,一個用來記住可能的地址,第三個指針指向目標字符串并且在改變了指針的指向后重新讓其指向目標字符串的首地址。

#include <stdio.h>
#include <assert.h>char* my_strstr(const char* str1, const char* str2)
{assert(str1 && str2);const char* s1 = NULL;const char* s2 = NULL;const char* cur = str1;//用于返回可能的地址if (*str2 == '0')//當目標字符串是空字符串時{return cur;}while (*cur != '\0'){   s1 = cur;s2 = str2;while (*s1 && *s2 && *s1 == *s2){s1++;s2++;}if (*s2 == '\0')//找到了目標字符串{return cur;}cur++;}return NULL;//沒找到
}int main()
{char str1[] = "abcdddeab";char str2[] = "deab";char* ps = my_strstr(str1, str2);if (NULL == ps){printf("不存在\n");}else{printf("%s\n", ps);}return 0;
}

10、 strerror 函數的使用

? ? ? ? 更多詳細介紹請跳轉閱讀 —>?strerror, strerror_s, strerrorlen_s - cppreference.com

?

?????????簡單地說,strerror 函數可以把參數部分錯誤碼對應的錯誤信息的字符串地址返回來。

? ? ? ? 在不同的系統和C語言標準庫的實現中都規定了一些錯誤碼,一般是放在 errno.h 這個頭文件中說明的,C語言程序啟動的時候就會使用一個全局的變量 errno 來記錄程序當前的錯誤碼,只不過程序啟動的時候 errno 是0,表示沒有錯誤,當我們在使用標準庫中的函數的時候發生了某種錯誤,就會將對應的錯誤碼存放在 errno 中,而一個錯誤碼的數字是整數很難理解是什么意思,所以每一個錯誤碼都是有對應的錯誤信息的,strerror 函數就可以將錯誤對應的錯誤信息字符串的地址返回來。

? ? ? ? ?整數0~10對應的錯誤信息如下:

?????????再來舉一個例子,其中涉及到一些我們之前還沒學到的內容,請不要在意,主要是 strerror 函數的用法。

?????????C語言函數中還有一個函數和 strerror 函數的功能是相似的,它就是 perror 函數。來看一下它的介紹:

? ? ? ? 它和 strerror 函數的區別在哪里呢?

????????strerror 函數的功能是將錯誤碼對應的錯誤信息的字符串的地址返回,而 perror 函數的功能是將 errno 中錯誤碼對應的錯誤信息打印出來。那它是怎樣打印的呢?perror 函數打印的規則是先打印字符指針s指向的字符串,再打印一個冒號和一個空格,然后打印錯誤碼對應的錯誤信息。?

?

? ? ? ? 可以看到上面 printf 函數和 perror 函數打印的內容是一樣的。

? ? ? ? 也就是說?perror == printf + strerror。我們可以根據自己的選擇選用這兩個函數。

????????如果覺得我的文章還不錯,請點贊、收藏 + 關注支持一下,我會持續更新更好的文章。??

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

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

相關文章

【LeetCode 130. 被圍繞的區域】

1. 題目 2. 分析 這題其實非常不錯。如果正向解&#xff0c;非常麻煩&#xff1b;因為很難界定哪些O是被包圍的&#xff1f;但是如果反向解呢&#xff1f;因為邊界的O不會被包圍&#xff0c;那么就可以想到跟邊界O相連的O都不會被包圍。那么除此之外的O都會被包圍&#xff0c…

【sklearn | 6】無監督學習與聚類分析

在前幾篇教程中&#xff0c;我們探討了 sklearn 的基礎、高級功能&#xff0c;異常檢測與降維&#xff0c;時間序列分析與自然語言處理&#xff0c;模型部署與優化&#xff0c;以及集成學習與模型解釋。本篇教程將專注于無監督學習和聚類分析&#xff0c;這在探索性數據分析和數…

github有趣項目:自制“我的世界” project make

videocodehttps://www.youtube.com/watch?v4O0_-1NaWnY,https://www.bilibili.com/video/BV1oj411p7qM/?https://github.com/jdah/minecraft-weekend MAKE git clone --recurse-submodules https://github.com/jdah/minecraft-weekend.git 正克隆到 minecraft-weekend... …

x264 參考幀管理源碼分析

x264參考幀管理 在x264中,參考幀的管理是一個重要的組成部分,因為它涉及到視頻編碼過程中的幀間預測。以下是關于x264參考幀管理的一些關鍵點: 參考幀的分類:在x264中,幀可以分為幾類,包括參考幀、當前編碼幀和未使用幀等。 參考幀的作用:參考幀用于幀間預測,通過比較當…

【Qt】之【Get√】QByteArray寫入txt文件、QByteArray截取數據

寫入文件 QFile file(path);if (file.open(QIODevice::WriteOnly)) {// 將 QImage 保存到文件file.write(jsonData.toByteArray());// 關閉文件file.close();SCDebug << "saved to" << path;} else {SCDebug << "Failed to open file for wri…

直播分享|深入解析ts-morph:通過注釋生成類型文檔

? ? 你看小狗在叫 樹葉會笑 風聲在呢喃? ? 乘風追夢&#xff0c;童心未泯 OpenTiny 預祝所有大朋友、小朋友兒童節快樂~ 與此同時&#xff0c;OpenTiny 貢獻者直播也即將開啟啦~ 直播主題&#xff1a;【深入解析ts-morph&#xff1a;通過注釋生成類型文檔】 6月1日&am…

碳課堂|入門必看!碳足跡(CFP)主要國際標準一覽

一、碳足跡概念 碳足跡&#xff08;Carbon FootPrint&#xff0c;CFP&#xff09;是用來衡量個體、組織、產品或國家在一定時間內直接或間接導致的二氧化碳排放量的指標。產品碳足跡屬于碳排放核算的一種&#xff0c;一般指產品從原材料加工、運輸、生產到出廠銷售等流程所產生…

NeuralForecast 推理 - 從csv文件里讀取數據進行推理

NeuralForecast 推理 - 從csv文件里讀取數據進行推理 flyfish from ray import tunefrom neuralforecast.core import NeuralForecast from neuralforecast.auto import AutoMLP from neuralforecast.models import NBEATS, NHITS import torch import torch.nn as nn import…

【Java】剛剛!突然!緊急通知!垃圾回收!

【Java】剛剛&#xff01;突然&#xff01;緊急通知&#xff01;垃圾回收&#xff01; 文章目錄 【Java】剛剛&#xff01;突然&#xff01;緊急通知&#xff01;垃圾回收&#xff01;從C語言的內存管理引入&#xff1a;手動回收Java的垃圾回收機制引用計數器循環引用問題 可達…

SpringBoot六種API請求參數讀取方式

SpringBoot六種API請求參數讀取方式 同步請求和異步請求 同步: 指單線程依次做幾件事異步: 指多線程同時做幾件事 同步請求: 指客戶端瀏覽器只有一個主線程, 此線程負責頁面的渲染和發出請求等操作, 如果此主線程發出請求的話則停止渲染而且會清空頁面顯示的內容 直到服務器響…

優化基礎(二):線性組合、仿射組合、錐組合、凸組合、線性集合、仿射集合、錐集合、凸集合的理解

文章目錄 前言組合線性組合 (linear combination)仿射組合 (affine combination)錐組合 (conic combination)凸組合 (convex combination) 集合仿射集合凸集合 練習&#xff1a;哪個圖形是凸的&#xff0c;哪個是仿射的&#xff1f;參考資料 前言 組合側重于描述由一些基點生成…

越洗越黑”的Pandas數據清洗

引言 先來一個腦筋急轉彎活躍一下枯燥工作日常&#xff0c;問&#xff1a;“什么東西越洗越黑&#xff1f;” 有沒有猜到的&#xff1f;猜不到我告訴你吧&#xff01; 答案是“煤球”。那么這個腦機急轉彎跟我們要討論的話題有沒有關系呢&#xff1f; 嗯是的&#xff0c;還是沾…

三相智能電表通過Modbus轉Profinet網關與PLC通訊案例

Modbus轉Profinet網關&#xff08;XD-MDPN100/300&#xff09;的主要功能是實現Modbus協議和Profinet協議之間的轉換和通信。Modbus轉Profinet網關集成了Modbus和Profinet兩種協議&#xff0c;支持Modbus RTU主站/從站&#xff0c;并可以與RS485接口的設備&#xff0c;它自帶網…

「前端+鴻蒙」核心技術HTML5+CSS3

1、CS架構與BS架構 CS架構(Client-Server):客戶端/服務器架構。用戶通過客戶端軟件與服務器進行交互,客戶端需要安裝特定的軟件才能訪問服務器上的資源。BS架構(Browser-Server):瀏覽器/服務器架構。用戶通過瀏覽器訪問服務器上的網頁,無需安裝額外的軟件,所有的交互都…

接口請求參數為文件時如何測試

方法 工具&#xff1a;Postman 步驟&#xff1a;①點擊body②點擊form-data③選擇key類型為fie ④輸入參數名⑤選擇參數上傳⑥發送請求

對稱二叉樹(oj題)

一、題目鏈接https://leetcode-cn.com/problems/symmetric-tree/ 二、題目思路 給你一個二叉樹的根節點 root &#xff0c; 檢查它是否軸對稱的思路: 1.將該樹的左子樹和右子樹&#xff0c;當做兩棵樹&#xff0c;調用 判斷兩棵樹是否對稱相等的函數 2.判斷兩顆樹是否對稱相…

告別低效提問:掌握BARD技巧,讓AI成為你的智能助手!

今天只聊一個主題&#xff1a;提示詞 Prompt。 說到提示詞&#xff0c;大家可能都看過GPT的高級示例&#xff0c;那些幾百字的提示詞&#xff0c;寫起來確實不容易。 那么&#xff0c;如何寫出同樣效果的提示詞呢&#xff1f; 有沒有什么公式或者系統學習的方法&#xff1f;…

在Linux/Ubuntu/Debian中使用lshw查看系統信息

在Linux/Ubuntu/Debian中使用lshw查看系統信息 lshw 是一個用于顯示硬件配置的命令&#xff0c;可以提供系統硬件的詳細信息&#xff0c;包括 CPU、內存、硬盤、主板等。該命令需要超級用戶權限來獲取詳細信息。 常見用法&#xff1a; 顯示所有硬件信息&#xff1a; sudo l…

木葉飛舞之【機器人ROS2】篇章_第三節、給turtlebot3安裝realsense深度相機

我們做視覺slam時會用到深度相機&#xff0c;但是gazebo的turtlebot3中只有rgb相機&#xff0c;沒有深度&#xff0c;因此本節會修改代碼&#xff0c;來給我們的小烏龜增加一個rgbd相機。 效果展示 發布topic如下圖 圖片大小都是640*480 1. 修改model.sdf文件 1.1 路徑位置…

射頻功率限幅器簡略

在功率輸入保護方面&#xff0c;限幅器是最好用的器件之一&#xff0c;可以保護后級電路不受超限功率的損害&#xff0c;限幅器其實像TVS功能一樣&#xff0c;讓超過閾值的功率釋放到接地上&#xff0c;來達到限制幅度的目的&#xff0c;目前限幅器的限幅幅度大多都大于15dBm,很…