\quad
\quad
\quad
\quad
\quad
\quad
\quad
\quad
\quad
\quad
得一个一个遍历
结合方案一和方案二的优点
\quad
\quad
\quad
\quad
\quad
\quad
#pragma once
#include<stdio.h>
#include<string.h>
#include<stdbool.h>
#include<stdlib.h>
#define MAXLEN 255
typedef char Stdate;
typedef struct SString{
char ch[MAXLEN];
int length;
}SString;
void PrintStr(SString* s); //打印串
void Strinit(SString* s);//初始化
void StrAssign(SString* s, char*c); //赋值操作,把串T赋值为chars
void ClearString(SString* s); //将S清为空串
bool SubString(SString* sub, SString* s, int pos, int len);//求子串, 从pos的位置起,len长,放入sub
int StrCompare(SString* a, SString* b);//比较两个字符串的大小,若a>b,则返回>0,若相等,则返回0,若a
int Index(SString* a, SString* b); //若主串中存在与串b值相同的子串,则返回它第一次出现的位置, 否则返回0;
void Strinit(SString* s)//初始化
{
s->length = 0;
}
void StrAssign(SString* s, char* c) //赋值操作,把串T赋值为chars
{
int i = 1;
while (*c != '\0')
{
s->ch[i] = *c;
i++;
c++;
s->length++;
}
}
void PrintStr(SString* s) //打印串
{
int i = 1;
for (i = 1; i <= s->length; i++) {
printf("%c ",s->ch[i]);
}
printf("\n");
}
void ClearString(SString* s) //将S清为空串
{
s->length = 0;
}
bool SubString(SString* sub, SString* s, int pos, int len)//求子串
{
int i = 0;
if (pos + len-1 > s->length)
{
return false;
}
else {
for (i = 0; i < len; i++)
{
sub->ch[i + 1] = s->ch[pos+i];
sub->length++;
}
return true;
}
}
int StrCompare(SString* a, SString* b)//比较两个字符串的大小,若a>b,则返回>0,若相等,则返回0,若a
{
for (int i = 1; i <= a->length && i <= b->length; i++)
{
if (a->ch[i] != b->ch[i])
{
return a->ch[i] - b->ch[i];
}
}
int k = a->length - b->length;
return k;
}
int Index(SString* a, SString* b) //若主串中存在与串b值相同的子串,则返回它第一次出现的位置, 否则返回0;
{
SString c;
Strinit(&c);
int i = 1;
int n = a->length;
int m = b->length;
while(i<=n-m+1)
{
SubString(&c, a, i, m);
if (StrCompare(&c, b) != 0)
{
ClearString(&c);
i++;
}
else {
return i;
}
}
return 0;
}
int main()
{
SString s;
SString sub;
char chars1[] = "abcdefghiklmn";
char chars2[] = "def";
Strinit(&s);
Strinit(&sub);
StrAssign(&s, chars1); //赋值串
StrAssign(&sub, chars2);
//PrintStr(&s);
//ClearString(&s); //将S清为空串
//PrintStr(&s);
//SubString(&sub, &s, 7, 4);
//PrintStr(&sub);
//比较两个字符串的大小,若a>b,则返回>0,若相等,则返回0,若a
//printf("%d\n", StrCompare(&s, &sub));
//若主串中存在与串b值相同的子串,则返回它第一次出现的位置, 否则返回0;
printf("%d\n", Index(&s, &sub));
return 0;
}