判断子字符串是否包含在原字符串中(且返回子字符串在原字符串中出现的位置)
一、说明
此篇博文算是针对于是否包含字符串的加强版。
判断子字符串是否实包含原字符串中可以参考:此篇博文
二、分析
测试比较字符串位置
说明:
i:当前原字符串指针的位置
j:当前比较字符串指针的位置
weizhi:比较字符串第n次出现在原字符串的位置
一个中文字符占两个字节
第一种:
原字符串:贾房贾测贾
比较字符串:贾
原字符串 比较字符串 比较字符串第n次出现在原字符串的位置
i=2 j=2 weizhi=2
i=6 j=2 weizhi=6
i=10 j=2 weizhi=10
第二种:
原字符串:贾继康房贾继康测贾继康
比较字符串:贾继康
原字符串 比较字符串 比较字符串第n次出现在原字符串的位置
i=6 j=6 weizhi=2
i=14 j=6 weizhi=10
i=22 j=6 weizhi=18
第三种:
原字符串:测试贾继康房贾继康测贾继康侧设计费
比较字符串:贾继
原字符串 比较字符串 比较字符串第n次出现在原字符串的位置
i=8 j=4 weizhi=6
i=16 j=4 weizhi=14
i=24 j=4 weizhi=22
三、代码
/*
程序功能:
1:判断子字符串是否实现在原字符串中
2:且返回出现在原字符串所在的位置
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//int is_in(char s, char c);
int is_in(char *s, char *c, int location[]);
int main()
{
char str[100] = "测试贾继康房贾继康测贾继康侧设计费";
char str1[100] = "贾继康";
//int *location = (int *)malloc(n * sizeof(int));
int loc[250] = {0};
int *location = loc;
if (is_in(str, str1, location) == 1)
{
printf("原文件包含比较字符串\n");
for (int i = 0; i < sizeof(location); i++)
{
if (location[i] != 0) //待查字符串在原字符串中不为空
{
printf("所在的位置:%d\n", location[i]);
}
}
}
else
{
printf("原文件不包含指定字符串\n");
}
}
// 子函数
int is_in(char *s, char *c, int location[])
{
int i = 0, j = 0, flag = -1;
int firstW = 0;
int num = 0;
while (i < strlen(s) && j < strlen(c)) // s:原字符串,c: 比较字符串
{
if (s[i] == c[j]) // 指针所指位置的字符
{ //如果字符相同则两个字符都增加
i++;
j++;
}
else
{
i = i - j + 1; //主串字符回到比较 最开始比较的 后一个字符
j = 0; //字串字符重新开始
}
if (j == strlen(c)) //如果匹配成功
{
flag = 1; //字串出现
//i-strlen(c) 比较字符在原字符串中第一次出现的位置
printf("此时原字符串指针i的位置 %d\n", i);
printf("此时比较字符串指针j的位置 %d\n", j);
printf("比较字符串在原字符串中第一次出现的位置 %d\n\n", i - strlen(c) + 2); // i-strlen(c)+2
location[num] = i - strlen(c) + 2;
num++;
j = 0;
continue;
/* if (s[i] == '\0' || s[i] == '\n')
{
printf("结束\n");
break;
} */
//return i-strlen(c)+2;
//break; // 第一次出现了不能结束
}
}
return flag;
//return i-strlen(c) +2;
}
四、结果
五、补充
目的:int型数字转换为char型字符串
分析:
1、将所有的int型数字通过拼接,形成int型数组
2、再将int型数组转化为char型字符串