// 串的定长顺序存储实现.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> #include<stdio.h> #include<string> #include<iomanip> #define STRING_SIZE 255 using namespace std; typedef unsigned char SString[STRING_SIZE + 1]; //函数声明部分 void Error(char *s); //错误处理函数 void Strassign_string(SString &S, char chars[]); //赋值函数 void Clear_string(SString &s); //清空函数 void Destroy_string(SString &S); //销毁函数 int Getlength_string(SString &s); //得到定长顺序串的长度 int Compare_string(SString &s, SString &t); //比较两个订场顺序串的大小 void Concat_string(SString &t, SString &s1, SString &s2); //连接两个顺序串 void Substring_string(SString &sub, SString &s, int pos, int len); //得到主串的子串 void Insert_string(SString &S, SString &T, int pos); //插入函数 void Delete_string(SString &S, int t, int pos); //删除函数 //函数实现部分 void Error(char *s) //错误处理函数 { cout << s << endl; exit(1); } /*赋值算法设计:1、先计算待赋值顺序串的长度;2.如果待赋值字符串的长度为0,则将主串设置为空串 3.在待赋值字符串长度不为零的情况下,如果长度大于申请的空间,将发生截断现象,给出截断提示 如果长度小于等于申请的空间,不发生截断现象*/ void Strassign_string(SString &S, char chars[]) //赋值函数 { int i = 0; int chars_length = 0; //初始值设为0 while (chars[i] != '\0') //计算待赋值串的长度 { chars_length++; i++; } if (!chars_length) S[0] = 0; else { int j = 1; int k = 0; if (chars_length > STRING_SIZE) { while(j<=STRING_SIZE) { S[j++] = chars[k++]; } S[0] = STRING_SIZE; cout << "串常量长度大于给定空间,赋值发生截断!" << endl; } else { while (j <= chars_length) { S[j++] = chars[k++]; } S[0] = chars_length; } } } void Clear_string(SString &s) //清空函数 { s[0] = 0; } void Destroy_string(SString &S) //销毁函数 { for (int i = 1; i <= S[0]; i++) { delete &S[i]; } delete &S[0]; } int Getlength_string(SString &s) //得到定长顺序串的长度 { return s[0]; } /*定长顺序串的大小比较算法设计:以此比较串1和串1对应位置上的字符 1.如果串1大于串2,返回正数;2.如果串1等于串2,返回0;3,如果串1小于串2,返回负数*/ int Compare_string(SString &s, SString &t) //比较两个定长顺序串的大小 { for (int i = 1; (i <= s[0]) && (i <= t[0]); i++) { if (s[i] != t[i]) return (s[i] - t[i]); else return (s[0] - t[0]); } } /*连接两个定长顺序串的算法设计:基于定产顺序串S1和S2的连接操作,对超过预定义空间的部分需要实施截断操作。 基于S1和s2长度的不同,连接时可能有以下四种情况: 1.S1[0]+S2[0]<=STRING_SIZE,则得到的串是正确的串; 2.S1[0]+S2[0]>STRING_SIZE,且S1[0]<STRING_SIZE,则得到的串是S1的全串,S2的部分,S2将发生截断; 3.S1[0]=STRING_SIZE,则得到的串是S1串; 4.S1[0]>STRING_SIZE,则得到的串是S1的部分,S1将发生截断;*/ void Concat_string(SString &t, SString &s1, SString &s2)//连接两个顺序串 { if ((s1[0] + s1[0]) <= STRING_SIZE) { int j = 1; int k = 1; while (j <= s1[0]) { t[k++] = s1[j++]; } j = 1; while (j <= s2[0]) { t[k++] = s2[j++]; } t[0] = s1[0] + s2[0]; cout << "正确连接,没有发生截断!" << endl; } else if ((s1[0]) <= STRING_SIZE) { int j = 1; int k = 1; while (j <= s1[0]) { t[k++] = s1[j++]; } j = 1; while (j <= s2[0]) { t[k++] = s1[j++]; } t[0] = STRING_SIZE; cout << "未正确连接,S2发生截断!" << endl; } else if ((s1[0])== STRING_SIZE) { int j = 1; int k = 1; while (j <= s1[0]) { t[k++] = s1[j++]; } t[0] = STRING_SIZE; cout << "未正确连接,S2没有连接上!" << endl; } else { int j = 1; int k = 1; while (j <= s1[0]) { t[k++] = s1[j++]; } t[0] = s1[0]; cout << "未正确连接,S1发生截断现象!" << endl; } } void Substring_string(SString &sub, SString &s, int pos, int len) //得到主串的子串 { if ((pos<1) || (pos>s[0]) || (len < 0) || (len>(s[0] - pos + 1))) Error("参数输入错误,请再次输入!"); for (int i = 1; i <= len; i++) { sub[i] = s[pos + i - 1]; } sub[0] = len; } void Insert_string(SString &S, SString &T, int pos)//将子串插入到主串pos位置后 { if ((S[0] + T[0]) <= STRING_SIZE) { int j = 0; for (int i = (S[0]+T[0]); i >= pos; i--) //将主串从后往前移动,腾出子串的位置 { S[i] = S[S[0] - j]; j++; } j = 1; for (int i = pos; i < (pos + T[0]); i++) //将子串插入到pos位置起的部分 { S[i] = T[j]; j++; } S[0] = S[0] + T[0]; } } void Delete_string(SString &S, int t, int pos) //从主串中pos位置起删除t个字符 { for (int i = pos; i < (S[0] - pos + 1); i++) { S[i] = S[i+t]; } S[0] = S[0] - t; } int _tmain(int argc, _TCHAR* argv[]) { char a[50] = { "abc" }; SString S1; Strassign_string(S1, a); cout << "串S1的长度是:" << Getlength_string(S1) << endl; char b[50] = { "ABCDEFGHIJKLMN"}; SString S2; Strassign_string(S2, b); cout << "串S2的长度是:" << Getlength_string(S2) << endl; cout << "比较字符串的结果是:" << Compare_string(S1, S2) << endl; Insert_string(S2, S1, 3); cout << "插入后的字符串是:"; for (int i = 1; i <= S2[0]; i++) { cout << S2[i]; } cout << endl; Delete_string(S2, 3, 2); cout << "删除后的字符串是:"; for (int i = 1; i <= S2[0]; i++) { cout << S2[i]; } cout << endl; SString S3; Concat_string(S3, S1, S2); cout<<"连接后的字符串长度是:" << Getlength_string(S3) << endl; cout << "连接后的字符串是:"; for (int i = 1; i <= S3[0]; i++) { cout << S3[i]; } cout << endl; SString S4; Substring_string(S4, S3, 3, 5); cout << "取出的子串是:"; for (int i = 1; i <= S4[0]; i++) { cout << S4[i]; } cout << endl; return 0; }