3.1 串--顺序存储
- main.c
//
// main.c
// 11_StackString
//
// Created by ls on 2022/5/24.
// Copyright © 2022 LSC001. All rights reserved.
//
#include "SString.h"
int main() {
SString S;
InitString(S);
char *str = "ABC";
StrAssign(S,str);
SString T;
InitString(T);
StrAssign(T,"12");
StrInsert(S,4,T);
PrintString(S);
//
// SString V;
// InitString(V);
// StrAssign(V,"++");
//
// PrintString(S);
// PrintString(T);
// PrintString(V);
// StrReplace(S,T,V);
// PrintString(S);
// printf("%d\n",StrIndex(S,T,3));
// PrintString(S);
// StrDelete(S,4,3);
// PrintString(S);
// printf("%d\n",StrCompare(S,T));
// SString T;
// StrCopy(T,S);
// PrintString(S);
// PrintString(T);
// printf("%d\n",StrEmpty(S));
// printf("%d\n",StrLength(S));
// StrClear(S);
// PrintString(S);
// SString A;
// StrConcat(A,S,T);
// PrintString(A);
// PrintString(T);
// PrintString(S);
// StrClear(S);
// PrintString(S);
// PrintString(S);
// SString T = "12";
//int select=1;
// while(select)
// {
// printf("***********************************************\n");
// printf("* [1] StrAssign [2] StrCopy *\n");
// printf("* [3] StrEmpty [4] StrCompare *\n");
// printf("* [5] StrLength [6] StrConcat *\n");
// printf("* [7] SubString [8] StrIndex *\n");
// printf("* [9] StrReplace [10] StrInsert *\n");
// printf("* [11] StrDelete [11] StrClear *\n");
// printf("* [11] PrintString *\n");
// printf("***********************************************\n");
// printf("请选择:> ");
// scanf("%d",&select);
// if(0 == select)
// break;
//void StrDelete(SString S,int pos,int len); // 11 从pos删除len的字符。
//void StrClear(SString S); // 12
//void PrintString(SString S); // 13
//
// switch (select)
// {
// case 1:
//
// break;
// case 2:
// pop_back(&mystack,&value);
// show_Stack(&mystack);
// break;
// case 3:
// show_Stack(&mystack);
// break;
// case 4:
// printf("Empty: %ld\n",isEmpty(mystack));
// break;
// case 5:
// get_top(mystack);
// break;
// case 6:
// printf("length: %ld\n",length(mystack));
// break;
// case 7:
// clear0(&mystack);
// break;
// case 8:
// destroy(&mystack);
// break;
// default:
// printf("输入错误!");
// break;
// }
// }
//destroy(&mystack);
printf("Hello, World!\n");
return 0;
}
- SString.h
//
// SString.h
// 11_StackString
//
// Created by ls on 2022/5/24.
// Copyright © 2022 LSC001. All rights reserved.
//
#ifndef SString_h
#define SString_h
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
// 1
#define MAXSTRLEN 30
#define u_char unsigned char
typedef u_char SString[MAXSTRLEN+1];
// 2
void InitString(SString S);
void StrAssign(SString S,char *str); // 1 赋值,
void StrCopy(SString S,SString T); // 2 复制
bool StrEmpty(SString S); // 3 判断字符串是否为空
int StrCompare(SString S,SString T); // 4 比较两个字符串的大小
int StrLength(SString S); // 5 字符串长度
void StrConcat(SString T,SString s1,SString s2); // 6 T=s1+s2
void SubString(SString S,SString sub,int pos,int len); // 7 求子串,在指定位置pos上,截取了len,赋值给sub。
int StrIndex(SString S,SString T,int pos); // 8 从S的pos匹配T,找出T首次出现的位置。返回相应下标或-1.
void StrReplace(SString S,SString T,SString V); // 9 替换。用V替换S中所有与T相等不重叠的
void StrInsert(SString S,int pos,SString T); // 10 在S的pos前插入T。
void StrDelete(SString S,int pos,int len); // 11 从pos删除len的字符。
void StrClear(SString S); // 12 清除
void PrintString(SString S); // 13 打印
#endif /* SString_h */
- SString.c
//
// SString.c
// 11_StackString
//
// Created by ls on 2022/5/24.
// Copyright © 2022 LSC001. All rights reserved.
//
#include "SString.h"
void InitString(SString S)
{
S[0]='\0';
}
void StrAssign(SString S,char *str) // 1 把str放在T中。
{
int i = 0;
while(str[i] != '\0')
{
S[i] = str[i];
i++;
}
S[i] = '\0';
}
void StrCopy(SString S,SString T) // 2
{
int i = 0;
while(T[i] != '\0')
{
S[i] = T[i];
i++;
}
S[i] = '\0';
}
bool StrEmpty(SString S) // 3
{
return S[0]=='\0';
}
int StrCompare(SString S,SString T) // 4
{
int tmp = 0;
while(*S != '\0' || *T != '\0' )
{
tmp = *S - *T;
if(tmp != 0) break;
++S;
++T;
}
if(tmp>0)tmp = 1;
else if(tmp<0)tmp = -1;
return tmp;
}
int StrLength(SString S) // 5
{
int i = 0;
while (*S!='\0') {
++S;
++i;
}
return i;
}
void StrConcat(SString T,SString s1,SString s2) // 6 T=s1+s2
{
int len_s1 = StrLength(s1);
int len_s2 = StrLength(s2);
if(len_s1 + len_s2 <= MAXSTRLEN)
{
int i=0,j = 0 ;
while (s1[i] !='\0') {
T[i] = s1[i];
++i;
}
while (s2[j] !='\0') {
T[i+j] = s2[j];
++j;
}
T[j+i] = '\0';
}
else if(len_s1 <= MAXSTRLEN)
{
int i=0,j = 0 ;
while (s1[i] !='\0') {
T[i] = s1[i];
++i;
}
while (j<MAXSTRLEN-i) {
T[i+j] = s2[j];
++j;
}
T[MAXSTRLEN] = '\0';
}
else
{
int i=0 ;
while (s1[i] !='\0') {
T[i] = s1[i];
++i;
}
T[MAXSTRLEN] = '\0';
}
}
void SubString(SString S,SString sub,int pos,int len) // 7
{
if(pos<0 || pos>StrLength(S) || len<0 || len> StrLength(S)) return;
int i = 0;
while (len>0) {
sub[i]=S[pos+i-1];
++i;
--len;
}
sub[i]='\0';
}
int StrIndex(SString S,SString T,int pos) // 8
{
int len_s = StrLength(S);
int len_t = StrLength(T);
if(pos<0 || pos>len_s)return -10000;
int i = pos-1,j = 0;
while (i < len_s && j < len_t) {
if(S[i] == T[j]){++i; ++j;}
else{i=i-j+1;j=0;}
}
if(j>=len_t)return i-len_t;
else return 0;
}
void StrReplace(SString S,SString T,SString V) // 9
{
int len_s = StrLength(S);
int len_t = StrLength(T);
int len_v = StrLength(V);
int pos=1;
while (pos-1<len_s) {
int p_ = StrIndex(S,T,pos);
if(p_ == 0)break;
StrDelete(S,p_+1,len_t);
StrInsert(S,p_+1,V);
pos = p_+ len_v+1;
//i = pos-1;
}
printf("LSLSLS!\n");
}
void StrInsert(SString S,int pos,SString T) // 10
{
int len_s=StrLength(S);
int len_t=StrLength(T);
if(len_s + len_t > MAXSTRLEN || pos<0) return;
int i=len_s-1;
while (i>=pos-1) {
S[i+len_t]=S[i];
i--;
}
int j=0;
while (T[j] != 0) {
S[pos-1+j] = T[j];
++j;
S[len_s + len_t ]='\0';
}
}
void StrDelete(SString S,int pos,int len) // 11
{
if(pos+len>StrLength(S)) return;
int i = pos+len-1;
while (S[i]!= '\0') {
S[i-len]=S[i];
++i;
}
S[i-len]='\0';
}
void StrClear(SString S) // 12
{
S[0]='\0';
}
void PrintString(SString S) // 13
{
int i=0;
while (S[i]!='\0') {
printf("%c ",S[i]);
i++;
}
printf("\n");
}