查找一个字符串在另一个字符串的位置原理分析

假设有两个字符串S1和S2,其中S1和S2是指向字符串的指针。

我们要查找S2字符串在S1字符串中的位置。

t是一个游标地址,用于记录在S1中查找的起始地址。

查找s2的首元素在s1的位置t,如果找到,则对比s2和(s1+t)元素是否全部相同(对比长度为s2的长度,即对比的字符个数),如果在s1中没有找到s2的首元素,那么就返回一个空指针。具体思路,看下面的流程图:


源码:

/*
 ============================================================================
7.编写一个函数string_in(),它接受两个字符串指针参数,如果第二个字符串被包含在第一个字
符串中,函数就返回被包含的字符串的开始的地址,例如string_in("hats","at")返回hats中a的
地址,否则返回空指针,在一个使用循环的程序进行测试这个函数。
 ============================================================================
 */

#include <stdio.h>
#include <string.h>
void outtemp(void); //丢弃缓冲区中的多余的输入
char * string_in(char *s1,char *s2); //查找字符串s2在s1中的位置,如果没有找到则返回空指针
char * string_inchar(char *s1,char ch); //查找一个字符是否在一个字符串中,如果在则返回这个字符所在位置地址,否则返回NULL
int main(void)
{
	char *s1 = "abadsadsdfs";
	char temp[20];
	char *s2 = temp;
	char ch = 'y';
	while(ch != 'q'){
		puts("请输入将要查找的字符串:");
		gets(s2);
		if(string_in(s1,s2)){
			printf("找到了\n");
		}else{
			printf("没有找到\n");
		}
		printf("继续请按y,退出请按q:\n");
		ch = getchar();
		outtemp();
	}
    return 0;
}

void outtemp(void){
	char temp;
	while((temp = getchar()) != '\n')
		putchar(temp);
}
char * string_in(char *s1,char *s2){
	char * t = s1;
	if(s1 == NULL || s2 == NULL) return NULL;
	int n_s1 = strlen(s1);
	int n_s2 = strlen(s2);
	int k = 0;
	if(n_s1 < n_s2) return NULL;
	while((t = string_inchar(s1,s2[0])) != NULL){
		k = 0;
		if(strlen(t) < n_s2){
			return NULL;
		}else{
			for(int i = 0;i<n_s2;i++){
				if(t[i] == s2[i]){
					k++;
				}else{
					break;
				}
			}
			if(k == n_s2) return t;
		}
		s1 = t + 1;
	}
	return NULL;
}
char * string_inchar(char *s1,char ch){
	for(int i = 0;i < strlen(s1);i++){
		if(ch == s1[i]) return &s1[i];
	}
	return NULL;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值