📄 字符串子串 函数 267.cpp
字号:
#include "stdio.h"
#include "string.h"
int f(char a[],char b[],size_t *na,size_t *nb) //定义函数f(),形参a[]、b[]、*na、*nb接受实参的地址值
{
int i,j,flag;
for(i=0;*na-i>=*nb;i++) //a串剩余字符数<b串长度时,退出循环(a串总长>=b串长)
{
flag=0;
for(j=0;j<*nb;j++) //比较b串与a串中第i个字符开始的串
{
if(a[i+j]!=b[j]){flag=-1;break;} //当前字符不同,置标记-1,退出循环
}
if(flag==0){flag=i+1;break;} //如标记未修改,已找到子串,置标记flag为子串在源串中的起始位置,退出循环
}
return flag; //返回子串在源串中的起始位置值或-1
}
void main() //主函数
{
printf("\n\t\t输入两个字符串,判断是否子串\n");
printf("─────────────────────────────────\n");
while(1)
{
char a[50],b[50]; int flag;
size_t na,nb; //串长为无符号整变
printf(" 输入第一个字符串: "); gets(a); //入一串存入a组,不用scanf("%s",a);
printf(" 输入第二个字符串: "); gets(b); //入一串存入b组,不用scanf("%s",b); //只入一串,另一串不输入直接回车时,有问题?
na=strlen(a); //获a串长
nb=strlen(b); //获b串长
if(na>=nb) //如a串长>=b串长
{
flag=f(a,b,&na,&nb); //调用函数f(),地址值传与形参,获子串在源串中的起始位置值或-1 赋予flag
if (flag==-1){printf(" 串2“%s”不是串1“%s”的子串.\n",b,a);}
else /*if (flag==0)不要此条件*/{printf(" 串2“%s”是串1“%s”的子串,起始位置为: %d\n",b,a,flag);}
}
else if(na<nb) //如a串长<b串长
{
flag=f(b,a,&nb,&na); //调用函数f(),地址值传与形参,获子串在源串中的起始位置值或-1 赋予flag
if (flag==-1){printf(" 串1“%s”不是串2“%s”的子串.\n",a,b);}
else /*if (flag==0)不要此条件*/{printf(" 串1“%s”是串2“%s”的子串,起始位置为: %d\n",a,b,flag);}
}
printf("\n 是否继续输入吗?是则回车,否则输入‘空格’回车 ");
if(getchar()==' '){break;}
else {while(getchar()!='\n'){;}}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -