【c語言】字符函數與字符串函數(上)

大家好呀,今天給大家分享一下字符函數和字符串函數,說起字符函數和字符串函數大家會想到哪些呢??我想到的只有求字符串長度的strlen,拷貝字符串的strcpy,字符串比較相同的strcmp,今天,我要分享給大家的是我們一些其他的字符函數和字符串函數,跟著小張一起去看看吧!

文章目錄

  • 前言
  • 長度不受限制的字符串函數
    • strcat
  • 長度受限制的字符串函數
    • strncpy
    • strncat
    • strncmp
  • 字符串查找
    • strstr
    • strtok
  • 錯誤信息報告
    • strerror
  • 模擬實現
    • strcat的模擬實現
    • strstr的模擬實現
  • 總結

前言

C語言中對字符和字符串的處理很是頻繁,但是C語言本身是沒有字符串類型的,字符串通常放在 常量字符串中或者字符數組 中.字符串常量 適用于那些對它不做修改的字符串函數


長度不受限制的字符串函數

strcat

功能:可以在一個字符串后面追加字符
函數聲明:char *strcat( char *strDestination, const char *strSource );
頭文件:string.h
參數解釋以及返回值解釋:第一個參數接收被追加字符串數組的地址,第二個參數是追加的內容字符串數組,返回的是追加后字符串數組的地址
在這里插入圖片描述

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "abcdef";char arr2[] = "gh";strcat(arr1, arr2);printf("%s", arr1);}

注意:源字符串必須以 ‘\0’ 結束。
目標空間必須有足夠的大,能容納下源字符串的內容。
目標空間必須可修改。

int main()
{char arr1[20] = "abcdef";char arr2[] = {'a','b','c'};strcat(arr1, arr2);printf("%s", arr1);
}

在這里插入圖片描述
程序發生崩潰,arr2數組如果沒有’\0’的話,他會在后面地址上找到\0,在追加到arr1數組的時候,會越界放不下

字符串strcat函數不能自己給自己追加

追加前在這里插入圖片描述
追加后
在這里插入圖片描述
追加的時候把源數組中的‘\0’被追加字符所覆蓋


長度受限制的字符串函數

strncpy

功能:拷貝num個字符從源字符串到目標空間
函數聲明:char * strncpy ( char * destination, const char * source, size_t num );
頭文件:string.h
參數:第一個參數為接收目標空間地址,第二個參數接收是源空間地址,返回參數是目標地址,size_t是無符號整數類型,num是拷貝字符的數目

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>
#include <string.h>int main()
{char arr1[40] = "hered ";char arr2[] = "ll";strncpy(arr1,arr2,2);printf("%s",arr1);
}

在這里插入圖片描述

如果源字符小于要拷貝的個數會怎么樣??

int main()
{char arr1[40] = "hered+++++++++ ";char arr2[] = "ll";strncpy(arr1, arr2, 10);printf("%s", arr1);
}

在這里插入圖片描述
在這里插入圖片描述

注意:拷貝num個字符從源字符串到目標空間。
如果源字符串的長度小于num,則拷貝完源字符串之后,在目標的后邊追加0,直到num個。


strncat

功能:追加num個字符從源字符串到目標空間。
聲明:char * strncat ( char * destination, const char * source, size_t num );
頭文件:string.h
參數:第一個參數為接收目標空間地址,第二個參數接收是源空間地址,返回參數是目標地址,size_t是無符號整數類型,num是追加字符的數目

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{char arr1[40] = "hello ";char arr2[13] = "shuxiansheng";strncat(arr1, arr2, 3);printf("%s",arr1);
}

在這里插入圖片描述

strncat可以追加自己

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{char arr1[40] = "hello ";char arr2[13] = "shuxiansheng";strncat(arr1, arr1, 5);printf("%s",arr1);
}

在這里插入圖片描述


strncmp

功能:可以比較指定個數的字符串比較
聲明:int strncmp ( const char * str1, const char * str2, size_t num );
頭文件:string.h
參數:第一個參數接收第一個字符串地址,第二個參數接收第二個字符串地址,第三個參數為比較字符的個數,比較到出現另個字符不一樣或者一個字符串結束或者num個字符全部比較完。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{char arr1[6] = "hello";char arr2[] = "helld";int ret=strncmp(arr1, arr2, 4);printf("%d", ret);
}

在這里插入圖片描述

比較前四個字符,由于前四個字符相同,返回0,比較五個字符,o的ascll碼值大于d的ascll碼值返回1;


字符串查找

strstr

功能:查找子串
聲明: char * strstr ( char * str1, const char * str2 );
頭文件string.h
參數:第一個參數接收被查找的字符串的首地址,第二個參數疑似子串的字符串的首地址
如果是子串的話,返回字符串中子串的首地址,不是子串的話返回空指針在這里插入圖片描述

代碼

int main()
{char arr1[] = "abcdefg";char arr2[] = "fg";char *p=strstr(arr1,arr2);//保存返回子串的首地址if (p){printf("是子串:%s", p);}else{printf("不是子串");}}

編譯運行

在這里插入圖片描述
在這里插入圖片描述


strtok

功能:分隔子串
聲明:char * strtok ( char * str, const char * sep );
頭文件:string.h
參數:第一個參數接收被分解字符串的地址,第二個參數中接收的是字符串中分隔符的地址,返回被分隔子串的首地址

代碼

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = "hello@qq.com";char arr2[] = "@.";strtok(arr1, arr2);printf("%s", arr1);
}

編譯運行
在這里插入圖片描述

第一個參數指定一個字符串,它包含了0個或者多個由arr2字符串中一個或者多個分隔符分割的標記。
strtok函數找到arr1中的下一個標記,并將其用 \0 結尾,返回一個指向這個標記的指針。
strtok函數的第一個參數不為 NULL ,函數將找到arr1中第一個標記,strtok函數將保存它在字符串中的位置(strtok函數在內部維護了一個靜態變量保存這個位置)。
strtok函數的第一個參數為 NULL ,函數將在同一個字符串中被保存的位置開始,查找下一個標記。
如果字符串中不存在更多的標記,則返回 NULL 指針

代碼展示

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = "hello@qq.com";char arr2[] = "@.";printf("%s\n", strtok(arr1, arr2));printf("%s\n", strtok(NULL, arr2));printf("%s\n", strtok(NULL, arr2));}

編譯運行
在這里插入圖片描述

修改:我們可以將字符串arr1傳給strtok函數,第一個@分隔符。strtok函數返回字符串中第一個遇到分隔符之前的字符串首地址,”hello’',然后在循環中繼續調用strtok函數,第一個參數傳NULL,strtok自己維護的靜態變量,記住上次分隔的地方,不用在傳arr1.

代碼實現

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = "hello@qq.com";char arr2[] = "@.";char* p =NULL;for (p = strtok(arr1, arr2); p != NULL; p = strtok(NULL, arr2)){printf("%s\n",p);}}

編譯運行
在這里插入圖片描述


錯誤信息報告

strerror

功能:可以返回指向錯誤信息字符串地址
聲明:char *strerror( int errnum );
頭文件:string.h errno.h
參數:errnum是錯誤碼,就像404頁面,每個錯誤碼對應著錯誤信息,返回值是指向錯誤信息字符串地址

int main()
{printf("%s\n", strerror(0));printf("%s\n", strerror(1));printf("%s\n", strerror(2));printf("%s\n", strerror(3));}

在這里插入圖片描述

當我們向內存申請空間時,我們會使用malloc函數,如果申請的內存太大,是否會報錯呢??它會將錯誤碼放在整型全局變量errno中,使用errno時引用頭文件errno.h

代碼展示:

`#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{int *p=malloc(4000000000);//malloc申請內存失敗會返回空地址if (p == NULL){printf("%s\n", strerror(errno));}}`

在這里插入圖片描述

注意:遇到多個錯誤時,errno會不斷賦新的錯誤碼


模擬實現

strcat的模擬實現

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* mystrcat(char* p, char* q)
{assert(p && q);char* k = &p;//隨著p++,會丟失目標字符串首地址先保存while (*p){p++;}//將p指針移動到目標字符串'\0'位置while ((*p++=*q++))//將*q的值先給*p,然后兩個q++;p++;賦值后的ascll值不為0,繼續循環,當*q=='\0',賦值后ascll碼值為'\0',退出循環{}return k;//返回目標字符串首地址
}
int main()
{char arr1[20] = "abcde";char arr2[5] = "qqq";mystrcat(arr1, arr2);printf("%s", arr1);}

在這里插入圖片描述


strstr的模擬實現

char* mystrstr(char* str1, char* str2)
{char* s1 = str1;//兩個遍歷指針分別指向兩個字符串的首地址char* s2 = str2;char* cur = s1;//兩個字符串開始匹配的指針while (*cur)//每循環一次,就是重新匹配的過程{s1 = cur;//s1移動到下一個開始匹配的位置s2 = str2;//子串要從頭開始匹配while (*s1&&*s2&&(*s1 == *s2))//匹配的循環{s1++;s2++;}//不匹配退出循環if (*s2 == '\0')//當匹配循環完,s2的指針指向子串的末尾'\0';{return cur;//保存的是匹配成功時,字符串中匹配到的第一個字符首地址}cur++;                       //此時cur指向的位置不能作為開始匹配的位置,cur++;開始新一輪的匹配}return NULL;//當cur遍歷完字符串,則說明沒有該子串
}
int main()
{char arr1[] = "abcdecdfg";char arr2[] = "cdf";char *p=mystrstr(arr1,arr2);//如果找到子串返回字符串中和子串匹配的首字符首地址不為空if (p){printf("是子串");}else{printf("不是子串");}}

編譯運行
在這里插入圖片描述
在這里插入圖片描述


總結

字符串函數,字符函數在處理字符問題特別的方便,使得問題簡單化,本章還未講到的內存操作函數放在下一篇講,如果你覺得這篇文章對你有幫助的話,別忘了給小張點贊,收藏加關注,哪里不對的話還望大佬們指教,謝謝大家!!我會持續分享給大家自己學到的知識,也是在好好的做總結

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

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

相關文章

Photoshop制作漂亮光澤感3D按鈕

原文鏈接(https://img-blog.csdnimg.cn/45472c07f29944458570b59fe1f9a0e0.png)

CentOS gcc介紹及快速升級

1.gcc介紹 GCC&#xff08;GNU Compiler Collection&#xff09;是一個開源的編譯器套件&#xff0c;由 GNU(GNUs Not Unix!的遞歸縮寫) 項目開發和維護。它是一個功能強大且廣泛使用的編譯器&#xff0c;支持多種編程語言&#xff0c;包括 C、C、Objective-C、Fortran、Ada 和…

性能測試技術之基礎篇(精華)

目錄 一、什么是性能&#xff1f; 二、什么是性能測試&#xff1f; 三、性能測試結果需要記錄哪些參數&#xff1f; 四、如何做性能測試&#xff08;性能測試流程&#xff09;&#xff1f; 1、指標建模 2、診斷調優 五、常見性能測試工具 一、什么是性能&#xff1f; …

【C語言】字符函數和字符串函數

目錄 1.求字符串長度strlen 2.長度不受限制的字符串函數 字符串拷貝strcpy 字符串追加strcat 字符串比較strcmp 3.長度受限制的字符串函數介紹strncpy strncat ?編輯strncmp 4.字符串查找strstr 5.字符串分割strtok 6.錯誤信息報告 strerror perror 7.字符分類函…

【算法挨揍日記】day03——雙指針算法_有效三角形的個數、和為s的兩個數字

611. 有效三角形的個數 611. 有效三角形的個數https://leetcode.cn/problems/valid-triangle-number/ 題目描述&#xff1a; 給定一個包含非負整數的數組 nums &#xff0c;返回其中可以組成三角形三條邊的三元組個數。 解題思路&#xff1a; 本題是一個關于三角形是否能成立…

淺談Fetch API

什么是Fetch API Fetch API 是一種現代的 JavaScript API&#xff0c;用于進行網絡請求和處理響應數據。它提供了一種更簡單和更靈活的方式來執行網絡請求&#xff0c;取代了傳統的 XMLHttpRequest&#xff08;XHR&#xff09;。 Fetch API 具有以下特點&#xff1a; Promise…

概述、搭建Redis服務器、部署LNP+Redis、創建Redis集群、連接集群、集群工作原理

Top NSD DBA DAY09 案例1&#xff1a;搭建redis服務器案例2&#xff1a;常用命令限案例3&#xff1a;部署LNPRedis案例4&#xff1a;創建redis集群 1 案例1&#xff1a;搭建redis服務器 1.1 具體要求如下 在主機redis64運行redis服務修改服務運行參數 ip 地址192.168.88.6…

【問題整理】Ubuntu 執行 apt-get install xxx 報錯

Ubuntu 執行 apt-get install xxx 報錯 一、問題描述: 執行apt-get install fcitx時&#xff0c;報如下錯誤 grub-pc E: Sub-process /usr/bin/dpkg returned an error code (1)二、解決方法: 嘗試修復依賴問題&#xff1a; sudo apt-get -f install這個命令會嘗試修復系統…

Elasticsearch:如何在 Ubuntu 上安裝多個節點的 Elasticsearch 集群 - 8.x

Elasticsearch 是一個強大且可擴展的搜索和分析引擎&#xff0c;可用于索引和搜索大量數據。 Elasticsearch 通常用于集群環境中&#xff0c;以提高性能、提供高可用性并實現數據冗余。 在本文中&#xff0c;我們將討論如何在 Ubuntu 20.04 上安裝和配置具有多節點集群的 Elast…

關于Linux Docker springboot jar 日志時間不正確 問題解決

使用Springboot項目的jar&#xff0c;制作了一個Docker鏡像&#xff0c;啟動該鏡像后發現容器和容器中的Springboot 項目的日志時間不正確。 解決 查看容器時間命令為&#xff1a; docker exec 容器id date 1. 容器與宿主機同步時間 在啟動鏡像時候把操作系統的時間通過&q…

SpringBoot創建和使用

spring core的方式來寫代碼還是比較繁瑣的&#xff0c;而spring boot就是幫助程序員使用spring開發的一個腳手架&#xff08;boot&#xff09;&#xff0c;它是一個用于構建Java應用程序的開源框架&#xff0c;旨在簡化開發流程并提高生產效率。它的主要優點有&#xff1a; 快速…

CSS簡介

目錄 CSS CSS概念 核心概念 為什么需要CSS 語法 CSS的引入方式 內聯樣式&#xff08;行內樣式&#xff09; 內部樣式 外部樣式&#xff08;推薦&#xff09; CSS CSS概念 CSS&#xff08;Cascading Style Sheets&#xff09;層疊樣式表&#xff0c;又叫級聯樣式表&am…

【Vue-Router】導航守衛

前置守衛 main.ts import { createApp } from vue import App from ./App.vue import {router} from ./router // import 引入 import ElementPlus from element-plus import element-plus/dist/index.css const app createApp(App) app.use(router) // use 注入 ElementPlu…

ShowMeBug CEO李亞飛受邀參加深圳青年創新創業系列沙龍電子信息專場

7月13日下午&#xff0c;由深圳市科技交流服務中心&#xff08;深圳市科技專家委員會辦公室&#xff09;主辦&#xff0c;深圳新一代產業園承辦的“2023深圳青年創新創業系列沙龍——電子信息專場”活動舉行。ShowMeBug CEO李亞飛受邀參加此次活動。 深圳市科學技術協會黨組成員…

微信小程序真機調試異常cmdId 1006, errCode-50011-已解決

cmdId 1006, errCode-50011 起因 小程序在模擬器上預覽沒問題,真機調試和體驗版首頁打不開,點展開顯示cmdId 1006, errCode-50011 解決 查了下1006, 說是廣告, 我沒接廣告,這個也不是錯誤碼 1006廣告組件被駁回你的廣告正在被審核,無法展現廣告后來找到幾個類似的帖子…

arm開發板 GDB遠程調試方法

1.前言 1.在linux下開發&#xff0c;免不了使用gdb調試&#xff0c;但是linux下開發嵌入式&#xff0c;都是跑在ARM板子上的&#xff0c;網上有很多GDB的基礎教程&#xff0c;但是能在ARM開發板用的時候&#xff0c;會有各種問題。 比如&#xff1a;*.cpp: No such file or di…

Android su

1. userdebug和user版本 2. 關閉selinux system/core diff --git a/init/selinux.cpp b/init/selinux.cpp index 5a0255acd..787917274 100644--- a/init/selinux.cpp b/init/selinux.cpp -104,6 104,8 EnforcingStatus StatusFromCmdline() { } bool IsEnforcing() { …

元宇宙時代超高清視音頻技術白皮書關于流媒體協議和媒體傳輸解讀

流媒體協議 元宇宙業務場景對流媒體傳輸的實時性和互動性提出了更高的要求&#xff0c;這就需要在傳統的 RTMP、SRT、 HLS 等基礎上增加實時互動的支持。實時互動&#xff0c;指在遠程條件下溝通、協作&#xff0c;可隨時隨地接入、實時地傳遞虛實融合的多維信息&#xff0c;身…

萬賓燃氣管網監測解決方案,守護城市生命線安全

方案背景 城市燃氣管網作為連接天然氣長輸管線與天然氣用戶的橋梁&#xff0c;擔負著向企業和居民用戶直接供氣的重要職責。隨著城市燃氣需求的急劇增加&#xff0c;城市燃氣管網規模日趨龐大&#xff0c;安全隱患和風險也隨之增加。目前&#xff0c;我國燃氣管網的運行仍存在…

Mathematica(42)-計算N個數值的和

比如&#xff0c;我們要用Mathematica求得到下面的式子&#xff1a; 這就需要用到一個函數&#xff1a;Sum 具體地&#xff0c;Sum函數的使用形式如下&#xff1a; 因此&#xff0c;按照公式就可以得到下面的結果&#xff1a; 如果&#xff0c;我們想要將求和號也加進去&#…