【C】C语言三种方法判别指定字符串是否被另一字符串包含
·
C语言两种方法判别指定字符串是否被另一字符串包含
一、方案一
1、代码
/*
程序目的:
判断指定字符串是否包含在另一个字符串中
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int is_in(char *wenben, char *search_word);
int find(char *buf, char *sub);
int main()
{
// 调用函数一
if (is_in("机房机房就感觉贾继康", "贾继康") == 1) // 调用函数:参数二:比较文本,参数一:原文本
{
printf("\n包含");
}
else
{
printf("\n不包含");
}
}
// 创建函数(方法一):是否包含字符串函数
int is_in(char *wenben, char *search_word)
{
int i = 0, j = 0, flag = -1;
while (i < strlen(wenben) && j < strlen(search_word))
{
if (wenben[i] == search_word[j])
{ //如果字符相同则两个字符都增加
i++;
j++;
}
else
{
i = i - j + 1; //主串字符回到比较最开始比较的后一个字符
j = 0; //字串字符重新开始
}
if (j == strlen(search_word))
{ //如果匹配成功
flag = 1; //字串出现
break;
}
}
return flag;
}
2、结果
二、方案二
1、代码
/*
程序目的:
判断指定字符串是否包含在另一个字符串中
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int is_in(char *wenben, char *search_word);
int find(char *buf, char *sub);
int main()
{
// 调用函数二
char buf[] = "贾继康几点服";
if (find(buf, "贾继康") == 1)
printf("\n是子串");
else
printf("\n不是子串");
system("pause");
}
// 创建函数(方法二):是否包含字符串函数
int find(char *buf, char *sub) // 参数一:主文本,参数二:待查词
{
int len = strlen(buf); // 主文本长度
char *p = (char *)malloc(len * 2 + 1); // 动态内存分配
memset(p, 0x00, len * 2 + 1); // 0x00:0---》 p:指针或者数组,0x00:赋给p的值 p的长度
strcpy(p, buf); // 将buf复制到P中
strcat(p, buf); //把buf所指字符串添加到p结尾处(覆盖p结尾处的'\0')并添加'\0'。返回指向p的指针。
if (strstr(p, sub) == NULL)
{ //在字符串p中查找第一次出现字符串sub的位置,不包含终止符 '\0'。
return 0;
}
else
{
return 1;
}
}
2、结果
三、方案三
1、代码
/*
程序功能:
1: 判断原字符串是否包含指定字符串
2: 返回第一次包含出现的位置
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int find(char *source, char *target);
int main()
{
// 调用函数二
char buf[] = "贾继康测试贾继康"; //
char buf2[] = "贾继康测试贾继康";
char buf3[] = "继康"; //
char *p = buf;
char *p2 = buf3;
// printf("数组所占空间大小:%d\n", sizeof(buf2));
// printf("%c",*(p+3));
if (find(buf, buf3) == 1)
{
printf("有");
}
else
{
printf("无");
}
}
// 创建函数
// source为源字符串,target为子字符串,如找到则返回在源串中的位置,
//如未找到则返回-1,如果要改为找到返回1,把return i改为return 1;
int find(char *source, char *target)
{
int i, j;//原字符和目标字符位置
int s_len = strlen(source); // 原字符串长度
int t_len = strlen(target); // 目标字符串长度
int weizhi = 0;
/* if (t_len > s_len) // 目标字符串长度< 原字符串长度
{
return -1;
} */
for (i = 0; i <= s_len; i++)
{
j = 0;
int flag = 1;
// 从i=0,j=0 开始
if (source[i] == target[j]) // 待查字符与原字符中的字符相等时
{
int k, p = i; // 这里将p=i:获取目标字符当前的位置
weizhi++;//位置
for (k = 0; k < t_len; k++) // 以目标字符串作为遍历次数。进一步遍历原字符
{
if (source[p] == target[j]) // 继续相同
{
p++;// 相同位置上:继续前移
j++;
continue;
}
else
{
flag = 0;
break;
}
//printf("第一次当前%d");
}
} // 当source[i] == target[j]对应位置的字符不相等
else
{
continue; // 下一个
}
//printf("位置%d\n",weizhi);
if (flag == 1)
{
printf("此时原字符串指针i的位置 %d\n", i);
printf("此时比较字符串指针j的位置 %d\n",j);
printf("比较字符串在原字符串中第一次出现的位置 %d\n\n", i-strlen(target)+2);// i-strlen(c)+2
return 1;
}
}
return -1;
}
2、结果
四、参考链接
1、https://blog.csdn.net/kkwant/article/details/81133814
2、https://blog.csdn.net/meiqi0538/article/details/83819727
更多推荐
已为社区贡献7条内容
所有评论(0)