不说废话直接上源码
C语言实现
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define MAXSTRLEN 255
#define OK 1
#define ERROR -1
typedef int Status;
typedef struct{
char str[MAXSTRLEN];
int length;
}StringType;
Status StrConcat(StringType *s, StringType *t);
Status subString(StringType s, int pos, int len);
void MyPuts(StringType s);
int StrCompare(StringType s, StringType t);
void StrLength(StringType s);
void ClearStr(StringType *s);
int Index(StringType s, StringType t, int pos);
int main()
{
printf("--------菜单---------\n");
printf("1,字符串长度\n");
printf("2,清空字符串\n");
printf("3,两个字符串连接\n");
printf("4,两个字符串比较大小\n");
printf("5,求子串\n");
printf("6,求子串在主串中的位置\n");
StringType s;
printf("请输入字符串:");
while(1)
{
int key;
int pos,len;
StringType p, q;
StringType m, n;
StringType a;
StringType x, y;
int pos1;
gets(s.str);
s.length = strlen(s.str);
printf("请输入要执行的操作:");
scanf("%d", &key);
switch(key)
{
case 1:
StrLength(s);
break;
case 2:
ClearStr(&s);
break;
case 3:
getchar();
printf("请输入字符串:");
gets(p.str);
/*字符串的长度要存到数据结构中的length中*/
p.length = strlen(p.str);
printf("请输入字符串:");
gets(q.str);
q.length = strlen(q.str);
StrConcat(&p, &q);
MyPuts(p);
break;
case 4:
getchar();
printf("请输入字符串:");
gets(m.str);
/*字符串的长度要存到数据结构中的length中*/
m.length = strlen(m.str);
printf("请输入字符串:");
gets(n.str);
n.length = strlen(n.str);
StrCompare(m,n);
break;
case 5:
getchar();
printf("请输入字符串:");
gets(a.str);
/*字符串的长度要存到数据结构中的length中*/
a.length = strlen(a.str);
printf("请输入子串开始的位置:");
scanf("%d", &pos);
printf("请输入子串长度:");
scanf("%d", &len);
subString(a, pos, len);
break;
case 6:
getchar();
printf("请输入字符串:");
gets(x.str);
/*字符串的长度要存到数据结构中的length中*/
x.length = strlen(x.str);
printf("请输子串:");
gets(y.str);
y.length = strlen(y.str);
printf("你想从第几个位置开始查询:");
scanf("%d", &pos1);
Index(x,y,pos1);
break;
default:
printf("defaul\n");
break;
}
}
return 0;
}
Status StrConcat(StringType *s, StringType *t)
{
int i;
if((s->length + t->length)>MAXSTRLEN)
{
printf("连接后长度超出范围\n");
return ERROR;
}
for(i=0; i < t->length; i++)
{
s->str[s->length+i] = t->str[i];
}
s->length = s->length + t->length;
return OK;
}
Status subString(StringType s, int pos, int len)
{
StringType sub;
int k, j;
if(pos<1||pos>s.length||len<0||len>(s.length-pos+1))
return ERROR;
sub.length = len;
for(j=0, k=pos-1;k<pos+len-1;k++,j++)
sub.str[j] = s.str[k];
printf("子串为:");
for(k = 0; k<sub.length; k++)
{
printf("%c", sub.str[k]);
}
printf("\n");
return OK;
}
void MyPuts(StringType s)
{
int i;
for(i = 0; i < s.length; i++)
{
putchar(s.str[i]);
}
}
int StrCompare(StringType s, StringType t)
{
int i;
for(i = 0; i<s.length&&i<t.length; i++)
{
if(s.str[i] != t.str[i])
{
printf("两个字符串不相等,Ascll码值相差:%d\n",s.str[i] - t.str[i] );
return s.str[i] - t.str[i];
}
}
if(s.length - t.length == 0)
{
printf("两个字符串相等\n");
return s.length - t.length;
}
if(s.length - t.length > 0)
{
printf("两个字符串不相等\n");
return s.length - t.length;
}
}
void StrLength(StringType s)
{
if(s.length == 0)
printf("字符串为空\n");
else
printf("字符串长度为%d\n", s.length);
}
void ClearStr(StringType *s)
{
if(s->str)
{
free(s->str);
}
s->length = 0;
printf("字符串以清空\n");
}
int Index(StringType s, StringType t, int pos)
{
int i = pos-1,j=0;
while(i <= s.length -1 && j<= t.length -1)
{
if(s.str[i] == t.str[j])
{
i++;
j++;
}
else
{
i = i-j+1;
j=0;
}
}
if(j>=t.length)
{
printf("匹配成功,子串在主串第 %d 个字符后的位置\n",i-t.length);
return i-t.length-1;
}
else
{
printf("匹配失败\n");
return 0;
}
}