C語(yǔ)言實(shí)現(xiàn)串的順序存儲(chǔ)表示與基本操作
本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)串的順序存儲(chǔ)表示與基本操作代碼,供大家參考,具體內(nèi)容如下
1、串的三種存儲(chǔ)表示
串,即:字符串。要注意的是,C語(yǔ)言中是沒(méi)有字符串?dāng)?shù)據(jù)類型的,而將其作為一種數(shù)據(jù)結(jié)構(gòu)——“內(nèi)容受限的線性表”進(jìn)行實(shí)現(xiàn),并對(duì)空串、空格串、串的長(zhǎng)度、子串與主串等概念進(jìn)行了約定【詳見(jiàn) 《數(shù)據(jù)結(jié)構(gòu)(C語(yǔ)言版)》 ,嚴(yán)蔚敏、吳偉民編著】 。
串的存儲(chǔ)表示主要分為三種:
【1】順序存儲(chǔ)表示 :使用字符型數(shù)組(一塊連續(xù)的內(nèi)存存儲(chǔ)空間)來(lái)存儲(chǔ)串的內(nèi)容,其最大長(zhǎng)度已經(jīng)定義則不可修改;(這也是C語(yǔ)言中初始約定好的一種較為字符串內(nèi)容的表示方式)
【2】堆分配存儲(chǔ)表示:使用malloc和free函數(shù)對(duì)堆區(qū)進(jìn)行操作,進(jìn)行堆區(qū)內(nèi)存的動(dòng)態(tài)分配與釋放,而這塊存儲(chǔ)空間就用于存儲(chǔ)串的內(nèi)容;
【3】塊鏈存儲(chǔ)表示:即采用鏈表的形式,通過(guò)指針,將位于不同存儲(chǔ)空間的多個(gè)字符串“碎片”進(jìn)行連接,“拼湊”成為一個(gè)完整的串
在此只介紹第一種,即:串的順序存儲(chǔ)表示。
2、串的順序存儲(chǔ)表示與基本操作
這部分就直接貼代碼了
【因?yàn)檫@里是對(duì)數(shù)組元素的操作,就偷個(gè)懶,直接用了C語(yǔ)言string.h頭文件中提供的一些庫(kù)函數(shù),對(duì)一些基本操作進(jìn)行了簡(jiǎn)單實(shí)現(xiàn)。需要詳細(xì)寫(xiě)代碼的部分到串的堆分配實(shí)現(xiàn)時(shí)候再體現(xiàn)】
2.1 頭文件聲明
/** * 串的順序存儲(chǔ)實(shí)現(xiàn) */ #include <string.h> #define MAXLEN 255 //結(jié)構(gòu)體定義-表示串結(jié)構(gòu)體 typedef struct{ char ch[MAXLEN+1];//存儲(chǔ)串內(nèi)容的字符型數(shù)組[+1是為了存儲(chǔ)結(jié)束標(biāo)志'\0'] int length;//當(dāng)前串的長(zhǎng)度 }SString; /** * 將字符串T復(fù)制為chars */ int StrAssignS(SString* T,char* chars); /** * 獲取字符串長(zhǎng)度 */ int StrLengthS(SString T); /** * 字符串的判空操作 */ int StrIsEmptyS(SString T); /** * 串連接操作 */ int StrConcatS(SString* T,char* s1,char* s2); /** * 截取子串 */ int SubStringS(SString* T,SString src,int pos,int len); /** * 串清空 */ int ClearStringS(SString* T); /** * 串比較 */ int StrCompareS(SString T1,SString T2);
2.2 函數(shù)實(shí)現(xiàn)
#include "SString.h" /** * 將字符串T復(fù)制為chars */ int StrAssignS(SString* T,char* chars){ //清空原始內(nèi)容 memset(T->ch,0,MAXLEN); T->length=0; //重新賦值為chars strcpy(T->ch,chars); T->length=(int)strlen(chars); /*printf("len=%d\n",strlen(T->ch));*/ return 0; } /** * 字符串的判空操作 */ int StrIsEmptyS(SString T){ return T.length==0; } /** * 獲取字符串長(zhǎng)度 */ int StrLengthS(SString T){ return T.length; } /** * 串連接操作 */ int StrConcatS(SString* T,char* s1,char* s2){ //輔助變量 char *p; //清空T中的內(nèi)容 memset(T->ch,0,MAXLEN); T->length=0; //連接字符串 p=strcat(s1,s2); //字符串連接到T中 strcpy(T->ch,p); T->length=(int)strlen(p); return 1; } /** * 截取子串 */ int SubStringS(SString* T,SString src,int pos,int len){ //清空T中的原始內(nèi)容 memset(T->ch,0,MAXLEN); T->length=0; //獲取子串 /** char *strncpy(char *dest, const char *src, size_t n) dest -- 指向用于存儲(chǔ)復(fù)制內(nèi)容的目標(biāo)數(shù)組 src -- 要復(fù)制的字符串 n -- 要從源中復(fù)制的字符數(shù) */ strncpy(T->ch,src.ch+pos,len); //重新設(shè)置串的長(zhǎng)度 T->length=len; return 1; } /** * 串比較 */ int StrCompareS(SString T1,SString T2){ /* int strcmp(const char *str1, const char *str2) 如果返回值小于 0,則表示 str1 小于 str2 如果返回值大于 0,則表示 str1 大于 str2 如果返回值等于 0,則表示 str1 等于 str2 */ return strcmp(T1.ch,T2.ch); } /** * 串清空 */ int ClearStringS(SString* T){ memset(T->ch,0,MAXLEN); T->length=0; return 1; }
2.3 函數(shù)測(cè)試
#include <stdio.h> #include <stdlib.h> #include "SString.h" int main(int argc,char **argv){ SString str1,str2; //str1.ch="Hello,World!"; StrAssignS(&str1,"Hello,World"); StrAssignS(&str2,"Hello"); printf("len=%d\n",StrLengthS(str1)); //字符串連接 StrConcatS(&str1,"SHello","Hi"); printf("len=%d\n",StrLengthS(str1)); //打印字符串內(nèi)容 printf("str1=%s\n",str1.ch); printf("str2=%s\n",str2.ch); printf("CompareRes=%d\n",StrCompareS(str1,str2)); //截取子串 SubStringS(&str2,str1,2,3); puts(str1.ch); puts(str2.ch); //清空字符串內(nèi)容 ClearStringS(&str1); printf("str1's len=%d,str2's len=%d,\nso str1 isEmpty:%d,str2 isEmpty:%d\n",StrLengthS(str1),StrLengthS(str2),StrIsEmptyS(str1),StrIsEmptyS(str2)); return 0; }
貼上測(cè)試結(jié)果的截圖:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Matlab實(shí)現(xiàn)別踩白塊小游戲的示例代碼
別踩白塊是一款音樂(lè)類休閑游戲,游戲的玩法不難,只需跟著音樂(lè)的節(jié)奏點(diǎn)中對(duì)的方塊即可。本文將用Matlab實(shí)現(xiàn)這一經(jīng)典游戲,感興趣的可以了解一下2022-03-03C語(yǔ)言實(shí)現(xiàn)圖書(shū)館管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)圖書(shū)館管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07詳解C語(yǔ)言中結(jié)構(gòu)體的自引用和相互引用
這篇文章主要介紹了C語(yǔ)言中結(jié)構(gòu)體的自引用和相互引用,詳細(xì)解析了結(jié)構(gòu)體中指針的指向情況,需要的朋友可以參考下2016-04-04C++利用代理模式實(shí)現(xiàn)遠(yuǎn)程代理,虛擬代理和保護(hù)代理
今天給大家簡(jiǎn)單介紹代理模式,一個(gè)很簡(jiǎn)單的設(shè)計(jì)模式,旨在不改變?cè)瓕?duì)象的情況下通過(guò)代理對(duì)象來(lái)控制對(duì)原對(duì)象的訪問(wèn)。代理模式根據(jù)具體情況還可以分為遠(yuǎn)程代理、虛擬代理、保護(hù)代理等,下面來(lái)介紹一下2023-04-04C語(yǔ)言 pthread_create() 函數(shù)講解
這篇文章主要介紹了C語(yǔ)言 pthread_create() 函數(shù)講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08C++實(shí)現(xiàn)模擬shell命令行(代碼解析)
這篇文章主要介紹了C++實(shí)現(xiàn)模擬shell命令行,本文通過(guò)實(shí)例代碼進(jìn)行命令行解析,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12示例詳解C++語(yǔ)言中的命名空間 (namespace)
C++名字空間是一種描述邏輯分組的機(jī)制,也就是說(shuō),如果有一些聲明按照某種準(zhǔn)則在邏輯上屬于同一個(gè)模塊,就可以將它們放在同一個(gè)名字空間,以表明這個(gè)事實(shí),這篇文章主要給大家介紹了關(guān)于C++語(yǔ)言中命名空間 (namespace)的相關(guān)資料,需要的朋友可以參考下2021-08-08