📄 3-4(串基本操作的演示).cpp
字号:
#include<stdio.h>
#include<stdlib.h>
#define STR_LEN 50
#define STR_INCREMENT 10
typedef struct
{
char cmd;
int args[3];
int num[2];
} CmdType;
char CmdSet[11] = {'A','E','C','L','S','I','R','P','D','Q','H'};
typedef struct
{
char *str;
int length;
int size;
} HString;
#define MAX 100
struct StrList
{
HString S[MAX];
int curnum;
} List;
char ch; // 定义字符ch为全局变量,因读入操作在两个函数中执行
typedef int Status;
#define OK 1
#define ERROR 0
#define QUIT -1
char StrAssign( HString &S )
{
if (S.str != NULL) free(S.str);
S.str = (char *)malloc(STR_LEN * sizeof(char));
if (!S.str) {
printf("malloc failure\n");
exit(ERROR);
}
S.size = STR_LEN;
S.length = 0;
ch = getchar();
while ( 1 )
{
if (ch == '\'')
{
ch = getchar();
if (ch != '\'')
break;
}
if (S.length >= S.size)
{
S.str = (char *)realloc(S.str, (S.size + STR_INCREMENT) * sizeof(char));
if (!S.str)
{
printf("malloc failure\n");
exit(ERROR);
}
S.size += STR_INCREMENT;
}
S.str[S.length] = ch;
++S.length;
ch = getchar();
}
return OK;
}
Status ClearString( HString &S )
{
if (S.str != NULL)
{
free(S.str);
S.str = NULL;
}
S.length = 0;
S.size = 0;
return OK;
}
int StrCompare( HString S, HString T )
{
int i;
for (i = 0; (i < S.length) && (i < T.length); ++i)
if (S.str[i] != T.str[i])
{
return (S.str[i] - T.str[i]);
}
return (S.length - T.length);
}
Status Concat( HString &T, HString S1, HString S2 )
{
int i,j;
if (T.str != NULL) free(T.str);
T.length = S1.length + S2.length;
if (T.length == 0)
{
T.str = NULL;
}
else
{
T.str = (char *)malloc(T.length * sizeof(char));
if (!T.str)
{
printf("malloc failure\n");
exit(ERROR);
}
j = 0;
for (i = 0; i < S1.length; ++i)
{
T.str[j] = S1.str[i];
++j;
}
for (i = 0; i < S2.length; ++i)
{
T.str[j] = S2.str[i];
++j;
}
}
return OK;
}
Status SubString( HString &Sub, HString S, int pos, int len )
{
int i;
if ((pos < 1) || (pos > S.length))
{
printf("ERROR, start-position not in main-string.\n");
return ERROR;
}
if ((len < 0) || (len > S.length-pos+1))
{
printf("ERROR, sub-string length too large.\n");
return ERROR;
}
if (Sub.str != NULL) free(Sub.str);
Sub.length = len;
if (Sub.length == 0)
{
Sub.str = NULL;
}
else
{
Sub.str = (char *)malloc(len * sizeof(char));
for (i = 0; i < len; ++i)
Sub.str[i] = S.str[pos+i];
}
return OK;
}
Status HStr_Assign( HString &S, HString &T )
{
// 将S的值赋给T
if (T.str != NULL) free(T.str);
T.str = S.str;
T.size = S.size;
T.length = S.length;
return OK;
}
Status Dec_List( int num )
{
int i;
for (i = num; i < List.curnum-1; ++i)
{
HStr_Assign( List.S[i + 1], List.S[i]);
}
--List.curnum;
List.S[List.curnum].str = NULL;
return OK;
}
Status SubStrIndex( HString S, HString T, int pos)
{
int next[STR_LEN];
void KMP_GetNext( HString T, int next[], int len );
int i,j;
KMP_GetNext( T, next, T.length );
i = pos;
j = 0;
while ((i < S.length) && (j < T.length))
{
if ((j == -1) || (S.str[i] == T.str[j]))
{
++i;
++j;
}
else
{
j = next[j];
}
}
if (j >= T.length) return (i - T.length + 1);
return 0;
}
void KMP_GetNext( HString T, int next[], int len )
{
int i,j;
i = 0;
j = -1;
next[0] = -1;
while (i < T.length-1)
{
if ((j == -1) || (T.str[i] == T.str[j]))
{
++i;
++j;
if (T.str[i] != T.str[j])
next[i] = j;
else
next[i] = next[j];
}
else
{
j = next[j];
}
}
}
Status Replace( HString S, HString T1, HString T2, HString &R )
{
int i,j,m,n;
R.str = (char *)malloc(S.size * sizeof(char));
if (!R.str)
{
printf("malloc failure\n");
exit(0);
}
R.size = S.size;
R.length = 0;
i = 0;
j = 0;
m = 0;
while (m < S.length )
{
m = SubStrIndex( S, T1, m) - 1;
if (m == -1)
m = S.length;
for (; j < m; ++j)
{
R.str[i] = S.str[j];
++i;
++R.length;
}
if (m == S.length)
break;
while (R.length + T2.length >= R.size)
{
R.str = (char *)realloc(R.str, (R.size + STR_INCREMENT) * sizeof(char));
if (!R.str)
{
printf("malloc failure\n");
exit(0);
}
R.size += STR_INCREMENT;
}
for (n = 0; n < T2.length; ++n)
{
R.str[i] = T2.str[n];
++i;
++R.length;
}
m += T1.length;
j = m;
}
return OK;
}
void PrtUsage( char c )
{
printf("===================================================\n");
printf("Usage:\t");
switch (c)
{
case 'A': printf("A 'abc'\n");
break;
case 'E': printf("E <string 1> <string 2>\n");
break;
case 'C': printf("C <string 1> <string 2>\n");
break;
case 'L': printf("L <string>\n");
break;
case 'S': printf("S <string> <num 1> <num 2>\n");
break;
case 'I': printf("I <main-string> <sub-string>\n");
break;
case 'R': printf("R <main-string> <sub-string 1> <sub-string 2>\n");
break;
case 'P': printf("P\n");
break;
case 'D': printf("D si (0 <= i < str-num)\n");
break;
case 'Q': printf("Q\n");
break;
case 'H': printf("A 'abc'\n");
printf("E <string 1> <string 2>\n");
printf("C <string 1> <string 2>\n");
printf("L <string>\n");
printf("S <string> <num 1> <num 2>\n");
printf("I <main-string> <sub-string>\n");
printf("R <main-string> <sub-string 1> <sub-string 2>\n");
printf("P\n");
printf("D si (0 <= i < str-num)\n");
printf("Q\n");
break;
}
printf("===================================================\n");
}
int IsCmd( char c )
{
int i;
for (i = 0; i < 11; ++i)
if (CmdSet[i] == c)
return (i + 1);
return 0;
}
int IsDigit( char c )
{
if ((c >= '0') && (c <= '9'))
return 1;
return 0;
}
int Count_args( CmdType cmmd )
{
switch (cmmd.cmd)
{
case 'A': return 1;
break;
case 'E': return 2;
break;
case 'C': return 2;
break;
case 'L': return 1;
break;
case 'S': return 1;
break;
case 'I': return 2;
break;
case 'R': return 3;
break;
case 'P': return 0;
break;
case 'D': return 1;
break;
default: return 0;
}
return 0;
}
int Count_argn( CmdType cmmd )
{
switch(cmmd.cmd)
{
case 'A':
case 'E':
case 'C':
case 'L':
case 'I':
case 'R':
case 'P':
case 'D': return 0;
break;
case 'S': return 2;
default: return 0;
}
return 0;
}
Status GetCmd( CmdType &cmmd )
{
int args_num,argn_num,num,flag;
fflush(stdin);
ch = getchar();
while (ch == ' ' || ch == '\t')
ch = getchar();
if (!IsCmd(ch))
{
printf("Wrong Command\n"); // 错误指令
return ERROR;
}
cmmd.cmd = ch;
if (cmmd.cmd == 'H') // help 指令
{
return OK;
}
args_num = 0;
argn_num = 0;
ch = getchar();
while (ch != '\n') // 读入一行命令,并将信息存放于cmmd中
{
while (ch == ' ' || ch == '\t')
ch = getchar();
if (ch == '\'')
{
if (cmmd.cmd == 'D') // 删除指令输入错误
{
printf("Deleting format ERROR.\n");
return ERROR;
}
StrAssign( List.S[List.curnum] );
cmmd.args[args_num] = List.curnum;
++args_num;
++List.curnum;
}
else if (ch == 's')
{
ch = getchar();
flag = 0;
num = 0;
while (IsDigit(ch))
{
num = num * 10 + (ch - '0');
++flag;
ch = getchar();
}
if (flag == 0) // 内部名输入格式错误
{
printf("ERROR\n");
return ERROR;
}
cmmd.args[args_num] = num;
++args_num;
}
else if (IsDigit(ch))
{
if (args_num == 0) // 输入格式错误,如 S 1 2 'abcde'
{
printf("ERROR");
return ERROR;
}
num = 0;
while (IsDigit(ch))
{
num = num * 10 + (ch - '0');
ch = getchar();
}
cmmd.num[argn_num] = num;
++argn_num;
}
else // 输入格式错误,如 a1
{
printf("ERROR\n");
return ERROR;
}
}
if ((args_num !=Count_args(cmmd)) || (argn_num != Count_argn(cmmd))) // 检查命令行参数数量的合法性
{
printf("ERROR\n");
return ERROR;
}
if (cmmd.cmd == 'Q')
return QUIT;
return OK;
}
Status ClearCmd( CmdType &cmmd )
{
int i;
cmmd.cmd = '\0';
for (i = 0; i < 3; ++i)
cmmd.args[i] = -1;
for (i = 0; i < 2; ++i)
cmmd.num[i] = -1;
return OK;
}
void InterFace()
{
printf("\t=============================================================\n");
printf("\t= String Processing demo =\n");
printf("\t= =\n");
printf("\t= A (assignment) E (equal) C (concat) =\n");
printf("\t= L (length) S (substring) I (index) =\n");
printf("\t= R (replace) P (print) D (delete) =\n");
printf("\t= Q (quit) =\n");
printf("\t= =\n");
printf("\t= - input 'H (<cmd>)' to get help =\n");
printf("\t=============================================================\n");
}
int main()
{
int stat,i,j,pos;
CmdType command;
InterFace();
while (1)
{
ClearCmd(command);
printf("Input Command:\n");
stat = GetCmd(command);
while (stat == ERROR)
{
printf("\nPlease input Command again:\n");
ClearCmd(command);
stat = GetCmd(command);
}
if (stat == QUIT)
{
printf("\t==================================================\n");
printf("\t= Quit, Thank you for running this program! =\n");
printf("\t==================================================\n");
return 0;
}
if (stat == OK)
{
switch (command.cmd)
{
case 'A': printf("String Assignment:\n");
printf("s%d : ",command.args[0]);
for (i = 0; i < List.S[command.args[0]].length; ++i)
printf("%c",List.S[command.args[0]].str[i]);
printf("\n");
break;
case 'E': if (StrCompare( List.S[command.args[0]], List.S[command.args[1]] ) == 0)
printf("EQUAL\n");
else printf("UNEQUAL\n");
break;
case 'C': if (Concat( List.S[List.curnum], List.S[command.args[0]], List.S[command.args[1]] ) == OK)
{
printf("Strings Concat:\n");
printf("s%d : ",List.curnum);
for (i = 0; i < List.S[List.curnum].length; ++i)
printf("%c",List.S[List.curnum].str[i]);
printf("\n");
++List.curnum;
}
break;
case 'L': printf("The length of s%d : %d\n",command.args[0],List.S[command.args[0]].length);
break;
case 'S': if (SubString( List.S[List.curnum], List.S[command.args[0]], command.num[0]-1, command.num[1] ) == OK)
{
printf("Get SubString:\n");
for (i = 0; i < List.S[List.curnum].length; ++i)
printf("%c",List.S[List.curnum].str[i]);
printf("\n");
++List.curnum;
}
else
{
printf("\nPlease input Command again:\n");
}
break;
case 'I': if ((pos = SubStrIndex( List.S[command.args[0]], List.S[command.args[1]], 0 )) != 0)
{
printf("SubString Positioning: %d\n",pos);
}
else
{
printf("no such a SubString in Main-string.\n");
}
break;
case 'R': if (Replace( List.S[command.args[0]], List.S[command.args[1]], List.S[command.args[2]], List.S[List.curnum] ) == OK)
{
printf("Replace SubStr1 in main-String with SubStr2:\n");
printf("New String s%d : ",List.curnum);
for (i = 0; i < List.S[List.curnum].length; ++i)
printf("%c",List.S[List.curnum].str[i]);
printf("\n");
++List.curnum;
}
break;
case 'P': if (List.curnum == 0)
{
printf("no Strings in the List.\n");
}
else
{
printf("Display all the strings:\n");
for (j = 0; j < List.curnum; ++j)
{
printf("s%d : ",j);
for (i = 0; i < List.S[j].length; ++i)
printf("%c",List.S[j].str[i]);
printf("\n");
}
}
break;
case 'D': if ((command.args[0] < 0) || (command.args[0] >= List.curnum))
{
if (command.args[0] == List.curnum-1)
{
printf("Command format ERROR.\n");
}
else
{
printf("Deletion failure, no such a String.\n");
}
printf("Usage: D si");
printf("\t\t( 0 <= i < %d )\n",List.curnum-1);
printf("\nPlease input Command again:\n");
}
else
{
printf("Delete String : ");
for (i = 0; i < List.S[command.args[0]].length; ++i)
printf("%c",List.S[command.args[0]].str[i]);
printf("\n");
if (Dec_List( command.args[0] ) == OK)
printf("success\n");
else
printf("fail\n");
}
break;
case 'H': while (((ch =getchar()) == ' ') || (ch == '\t'));
if (ch == '\n')
PrtUsage('H');
else if (IsCmd( ch ))
PrtUsage(ch);
else
printf("ERROR");
}
}
printf("\n");
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -