字符串函數(2)<C語言>

前言

??????? 快一周沒更博客了,最近有點忙,今天閑下來了,還是不行,繼續干,書接上回繼續介紹字符串函數:strncpy()、strncat()、strcmp()、strtok()使用、strstr()使用以及模擬實現、strerror()使用。


strncpy()、strncat()、strncmp()

??????? 這幾個函數看著很眼熟,用法確實和前文的函數類似,不同的是多出了一個n,也有一些不同。

strncpy()

??????? 函數參數及其返回類型:

char* strncpy(char* destination , const char* source , size_t num);
//返回值是目的字符串的起始地址

作用:

從源字符串中拷貝num個字符串到目的字符串中。

注意點:

①如果num大于源字符長度,在拷貝完源字符串后,在目標字符串中追加\0,直到num個。

②如果num小于源字符長度,在拷貝完指定字符串后,不會在目標字符串中追加\0

使用舉例:

?strncat()

??????? 函數參數及其返回類型:

char* strncat(char* destination , const char* source , size_t num);
//返回值是目的字符串的起始地址

作用:

從源字符串中追加前num個字符串到目的字符串中,再追加個\0。

注意點:

①如果num大于源字符長度,只會將源字符串中到\0的字符串追加到目的字符串末尾。

②相較于strcat()函數,strncat()可實現自追加(先用strlen()函數求出字符串長度,再追加),原因也很簡單,strncat()每次追加完畢會自動追加一個\0。

使用舉例:

??strncmp()

??????? 函數參數及其返回類型:

int strncat(const char* str1, const char* str2 , size_t num);
//返回值是大于:大于0的數、等于:0、小于:小于0的數

作用:

比較str1與str2前num個字符

注意點:

使用舉例:


?strtok()使用

??????? 函數參數及其返回類型:

char* strtok(char* str, const char* sep );
//返回值是指向找到以sep中的字符分隔的字符串的首地址,如果沒找到返回NULL

作用:

找到第一次以sep字符串中的字符分隔的字符串的首地址

注意點:

①sep參數中定義了分隔字符串的集合,也就是說可以為多個分隔字符且可以無序

②當找到第一個以sep中字符分隔的字符串時,將分隔字符以\0替代(strtok()函數會改變源字符,所以一般會使用一個臨時變量來接收,不改變源字符)

③strtok()函數具有記憶性(含有static關鍵字),所以當多次調用strtok()函數時,可將多個字段打印出來

④如果找不到以sep字符串中的字符分隔的字符串,就返回NULL

⑤strtok()函數第一個參數為NULL時,函數將在同一個字符保存的位置找下一個字段

使用舉例:

//strtok()函數舉例
#include<string.h>
int main() {char str[20] = "192.91.89.7";//以“.”分隔的字符串char* sep = ".";//分隔字符(可以為多個)char* ret = NULL;for (ret = strtok(str, sep); ret != NULL;ret=strtok(NULL,sep))//初始化表達式只執行一次,取出第一個字段:ret = strtok(str, sep)//條件表達式用于判斷是否為NULL,為NULL則找不到了:ret != NULL//更新表達式用于查找下一個字段,第一個參數為NULL時,會從上一次分隔位置查找:ret=strtok(NULL,sep)printf("%s\n", ret);return 0;
}

運行結果:


?strstr()使用以及模擬實現

????? 函數參數及其返回類型:

char* strstr(const char* str1, const char* str2 );
//返回值是在str1中第一次出現str2字符串的首地址,如果沒找到返回NULL

作用:

在str1中找str2字符串首次出現的位置

使用舉例:

?模擬實現:

#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;//cur直接指向str1while (*cur) {s1 = cur;//s1指向curs2 = str2;//s2變量用來指向str2while (*s1 && *s2 && *s1 == *s2) {//當s1和s2不為\0時繼續找:*s1 && *s2 //滿足條件找下一對字符:*s1 == *s2s1++;s2++;}if (!*s2) {//取反操作判斷是否為\0,為\0說明s2對應到最后一個字符,跳出循環了return cur;}cur++;//cur自增,當一次不滿足時,使指向cur的s1跳到下一個字符繼續匹配}return NULL;//指向str1的cur自增到str1的最后一個字符,還沒匹配成功,說明找不到了,返回NULL
}
//strstr()函數模擬實現
int main() {char str2[100] = "ABC";char str1[100] = "HJKANUABCENNS";char* str;str = my_strstr(str1, str2);printf("%s", str);return 0;
}

運行結果:


?strerror()

?????? 函數參數及其返回類型:

char* strerror(int errornum);
//返回值是整型數字errornum對應的錯誤碼信息首地址

作用:

strerror()函數可以把參數部分對應的錯誤碼返回

注意點:

簡單來說,在C語言編譯器上規定了一些錯誤碼(如棧溢出:strack overflew),一般存放在error.h頭文件中,當C語言程序啟動時,會使用全局變量errno來記錄當前錯誤碼的地址。

errno是一個全局變量用來存放錯誤碼。

使用舉例:

#include<string.h>
int main() {int i;for (i = 0; i < 10; i++) {printf("%s\n", strerror(i));//打印前10條錯誤碼,其中錯誤碼0為無錯}return 0;
}

運行結果:

?值得注意的是使用perror()函數可以直接將當前錯誤碼打印出來(括號內為提示信息,可不傳參)

?

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

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

相關文章

blender serpens3 個人總結

Serpens 全節點個人備注 快捷鍵 &#xff1a;shift v&#xff1a; 從復制版 添加執行操作&#xff08;blender任何執行動作按鈕&#xff0c;右鍵可以獲取操作命令&#xff09; 概念分析&#xff1a; 屬性&#xff08;Properties&#xff09;&#xff1a;用于定義持久性數據…

揭秘網絡編程:同步與異步IO模型的實戰演練

摘要 ? 在網絡編程領域&#xff0c;同步(Synchronous)、異步(Asynchronous)、阻塞(Blocking)與非阻塞(Non-blocking)IO模型是核心概念。盡管這些概念在多篇文章中被廣泛討論&#xff0c;它們的抽象性使得徹底理解并非易事。本文旨在通過具體的實驗案例&#xff0c;將這些抽象…

在React中使用Sass實現Css樣式管理-10

0. 什么是Sass Sass(Syntactically Awesome Stylesheets)是一個 CSS 預處理器&#xff0c;是 CSS 擴展語言&#xff0c;可以幫助我們減少 CSS 重復的代碼&#xff0c;節省開發時間&#xff1a; Sass 引入合理的樣式復用機制&#xff0c;可以節約很多時間來重復。支持變量和函…

【HM】簡單說明白:裝飾器@State、@Prop、@Link、@Provide、@Consume修飾變量,@Watch監聽變量狀態發生變化

首先要明白什么是“狀態變量”&#xff1f;即被狀態裝飾器&#xff08;State、Prop、Link、Provide、Consume&#xff09;修飾的變量&#xff0c;比如 State str : string; str就是狀態變量。狀態變量值的改變會引起UI界面重新渲染。 State State裝飾的變量&#xff0c;是私…

C++之“流”-第2課-C++和C標準輸入輸出同步

為什么C和C的標準輸入輸出不同步時&#xff0c;數據會混亂&#xff1f;同步會帶來多大性能損失&#xff1f;為什么說這個損失通常不用太在乎&#xff1f; 0. 課堂視頻 C之“流”-第2課&#xff1a;和C輸入輸出的同步 1. 理解cin和cout的類型與創建過程 std::cout 是std::ostre…

Ubuntu系統Discover軟件中心簡介

Discover軟件中心是Ubuntu操作系統中默認的軟件管理工具&#xff0c;它提供了一個圖形用戶界面(GUI)來幫助用戶瀏覽、搜索、安裝和卸載軟件包。Discover軟件中心是Ubuntu軟件中心(Ubuntu Software Center)的繼承者&#xff0c;它在Ubuntu 16.04 LTS版本中首次被引入&#xff0c…

添加、修改和刪除字典元素

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 由于字典是可變序列&#xff0c;所以可以隨時在字典中添加“鍵-值對”。向字典中添加元素的語法格式如下&#xff1a; dictionary[key] value 參數…

You don‘t have enough free space或者no space left on device異常

1.磁盤空間不足 Linux安裝軟件顯示 You dont have enough free space 或者docker拉鏡像時&#xff0c;出現磁盤空間不足的情況 no space left on device 如果你是ubuntu系統。查看磁盤空間 df -h 多半是這個目錄滿了/dev/mapper/ubuntu--vg-ubuntu--lv 大多情況我們只希望擴…

學習編程對英語要求高嗎?

學習編程并不一定需要高深的英語水平。我這里有一套編程入門教程&#xff0c;不僅包含了詳細的視頻講解&#xff0c;項目實戰。如果你渴望學習編程&#xff0c;不妨點個關注&#xff0c;給個評論222&#xff0c;私信22&#xff0c;我在后臺發給你。 雖然一些編程資源和文檔可能…

typora自動生成標題序號(修改V1.0)

目錄 帶序號效果圖 解決方法 帶序號效果圖 解決方法 1.進入文件夾&#xff1a;文件–>偏好設置–>外觀–>主題–>打開主題文件夾 2.如果沒有base.user.css文件&#xff0c;新建一個。如果有直接用記事本打開&#xff0c;把下面代碼拷貝進去保存。 /** initiali…

【JUC編程】-多線程和CompletableFuture的使用

多線程編程 文章目錄 多線程編程[toc]引言創建多線程的方式繼承Thread類實現Runnable接口實現Callable接口Callable和Runnable的區別 Lambda表達式 線程的實現原理Future&FutureTask具體使用submit方法Future到FutureTask類Future注意事項局限性 CompletionService引言使用…

第八大奇跡

目錄 題目描述 輸入描述 輸出描述 輸入輸出樣例 示例 輸入 輸出 運行限制 原題鏈接 代碼思路 題目描述 在一條 R 河流域&#xff0c;繁衍著一個古老的名族 Z。他們世代沿河而居&#xff0c;也在河邊發展出了璀璨的文明。 Z 族在 R 河沿岸修建了很多建筑&#xff0c…

java如何向數組中插入元素

java的數組是不可改變的&#xff0c;因此如果要向數組中插入新的元素&#xff0c;需要新建一個數組&#xff0c;新的數組元素個數減去老數組元素個數的差大于等于要插入新的元素數量。 假如說要插入一個數組元素&#xff0c;需要把新元素插入到中間&#xff0c;把新的數組分為…

Vue組件通訊?組件中通過 provide 來提供變量,然后在?組件中通過 inject 來注?變量例子

在Vue中&#xff0c;provide 和 inject 主要用于依賴注入&#xff0c;允許祖先組件向其所有子孫組件提供一個依賴&#xff0c;而不論組件層次有多深。這在開發高階插件/組件庫時特別有用。 以下是一個簡單的例子&#xff0c;演示了如何在父組件中使用 provide 提供變量&#x…

軟件測試面試題(八)

一&#xff1a;TestDirector有哪些功能&#xff0c;如何對軟件測試過程進行管理&#xff1f; 需求管理 定義測試范圍 定義需求樹 描述需求樹的功能點 測試計劃 定義測試目標和測試策略 分解應用程序&#xff0c;建立測試計劃樹 確定每個功能點的測試方法 將每個功能點連接…

Ps 濾鏡:消失點

Ps菜單&#xff1a;濾鏡/消失點 Filter/Vanishing Point 快捷鍵&#xff1a;Ctrl Alt V 兩條平行的鐵軌或兩排樹木連線相交于很遠很遠的某一點&#xff0c;這點在透視圖中叫做“消失點”&#xff0c;也稱為“滅點”。 消失點 Vanishing Point濾鏡主要用于在圖像中處理具有透視…

C++入門3——類與對象(2)

1.類的6個默認成員函數 如果一個類中什么成員都沒有&#xff0c;簡稱為空類。可是空類中真的什么都沒有嗎&#xff1f; 其實并不是的&#xff0c;任何類在什么都不寫時&#xff0c;編譯器會自動生成以下6個默認成員函數。 默認成員函數&#xff1a;用戶沒有顯式實現&#xf…

libmodbus開發庫介紹

目錄 功能概要源碼獲取源碼內容結構源碼與移植 功能概要 libmodbus是一個免費的跨平臺支持RTU和TCP的Modbus庫&#xff0c;遵循LGPL V2.1協議。libmodbus支持Linux、Mac Os X、FreeBSD、QNX和Windows等操作系統。libmodbus可以向符合Modbus協議的設備發送和接收數據&#xff0…

vector的reverse和resize區別

一 代碼 #include "stdafx.h" #include <iostream> #include <vector> using namespace std;class TEST{ public:TEST(){std::cout << "construct t" << std::endl;} };int main() {std::cout << "hello,world" …

《Python偵探手冊:用正則表達式破譯文本密碼》

在這個信息爆炸的時代&#xff0c;每個人都需要一本偵探手冊。阿佑今天將帶你深入Python的正則表達式世界&#xff0c;教你如何像偵探一樣&#xff0c;用代碼破解文本中的每一個謎題。從基礎的字符匹配到復雜的數據清洗&#xff0c;每一個技巧都足以讓你在文本處理的領域中成為…