假设有两个字符串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;
}