C語言實現串的順序存儲表示與基本操作
本文實例為大傢分享瞭C語言實現串的順序存儲表示與基本操作代碼,供大傢參考,具體內容如下
1 串的三種存儲表示
串,即:字符串。要註意的是,C語言中是沒有字符串數據類型的,而將其作為一種數據結構——“內容受限的線性表”進行實現,並對空串、空格串、串的長度、子串與主串等概念進行瞭約定【詳見 《數據結構(C語言版)》 ,嚴蔚敏、吳偉民編著】 。
串的存儲表示主要分為三種:
【1】順序存儲表示 :使用字符型數組(一塊連續的內存存儲空間)來存儲串的內容,其最大長度已經定義則不可修改;(這也是C語言中初始約定好的一種較為字符串內容的表示方式)
【2】堆分配存儲表示:使用malloc和free函數對堆區進行操作,進行堆區內存的動態分配與釋放,而這塊存儲空間就用於存儲串的內容;
【3】塊鏈存儲表示:即采用鏈表的形式,通過指針,將位於不同存儲空間的多個字符串“碎片”進行連接,“拼湊”成為一個完整的串
在此隻介紹第一種,即:串的順序存儲表示。
2 串的順序存儲表示與基本操作
這部分就直接貼代碼瞭
【因為這裡是對數組元素的操作,就偷個懶,直接用瞭C語言string.h頭文件中提供的一些庫函數,對一些基本操作進行瞭簡單實現。需要詳細寫代碼的部分到串的堆分配實現時候再體現】
2.1 頭文件聲明
/** * 串的順序存儲實現 */ #include <string.h> #define MAXLEN 255 //結構體定義-表示串結構體 typedef struct{ char ch[MAXLEN+1];//存儲串內容的字符型數組[+1是為瞭存儲結束標志'\0'] int length;//當前串的長度 }SString; /** * 將字符串T復制為chars */ int StrAssignS(SString* T,char* chars); /** * 獲取字符串長度 */ 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 函數實現
#include "SString.h" /** * 將字符串T復制為chars */ int StrAssignS(SString* T,char* chars){ //清空原始內容 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; } /** * 獲取字符串長度 */ int StrLengthS(SString T){ return T.length; } /** * 串連接操作 */ int StrConcatS(SString* T,char* s1,char* s2){ //輔助變量 char *p; //清空T中的內容 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中的原始內容 memset(T->ch,0,MAXLEN); T->length=0; //獲取子串 /** char *strncpy(char *dest, const char *src, size_t n) dest -- 指向用於存儲復制內容的目標數組 src -- 要復制的字符串 n -- 要從源中復制的字符數 */ strncpy(T->ch,src.ch+pos,len); //重新設置串的長度 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 函數測試
#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)); //打印字符串內容 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); //清空字符串內容 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; }
貼上測試結果的截圖:
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。