目录
题目
一、想法
二、实现代码
1.‘strstr’函数部分
注意点
2.main函数部分
3.完整代码
总结
题目
描述
编写一个函数,函数的目的是在字符串1中找字符串2首次出现的位置;
输入
分为两行,第一行为一个字符串1,母字符串str1,第二行为一个字符串2,子字符串str2
输出
输出一行,为一个整数,输入str2在str1中首次出现的位置(str2的首字母在str1中的位置),若未出现,则输出-1
样例输入
#example1
The quick brown dog jumps over the lazy fox
lazy
#example2
I am a good student
teacher
样例输出
#answer1
36
#answer2
-1
一、想法
不知道各位看完题目的第一想法是什么,但是笔者作为一个刚学c语言1个月的普通学生,想到的是函数strstr
如下是strstr函数的定义
strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。
如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;
否则,返回NULL。
其实不难看出,本题目是strstr函数的一个缩减版,只需要我们判断str2是否在str1中出现,和初次出现的位置。鉴于此,笔者就使用strstr来暂时代替此题目的函数。
而笔者的知识储备很差,这里就用最基础的方法即从str1的第一位开始,一位一位的对比,判断str2是否出现,虽然方法很笨,但是最后也是实现了目的,且自认为思路是清晰的。
请看代码
二、实现代码
1.‘strstr’函数部分
int strstr(char* str1, char* str2)
{
int location;
int locate = 1;
char* copy; copy = str2;
int num=0;
while (*str1 != '\0')
{
copy = str2;
num = 0;//num的实质是str2的长度
while (*str1 == *copy)//判断是否重复出现
{
copy++;
str1++;
locate++;
num++;
}
if (*copy == '\0')//str2已经完整出现
break;
if (num != 0) continue;//若可以循环locate和str1会加一,则不用再加
str1++; locate++;
}
if (*copy != '\0')location = -1;//str2未出现
else location = locate - num;//循环终止的位置减去str2的长度
return location;
}
注意点
if (num != 0) continue;
此处必须加上此代码,否则会继续执行接下来的
str1++; locate++;
造成str1和locate多加了一次,导致结果错误
此处应该是可以简化的,但无奈笔者才疏学浅(其实是为了复习高数A的半期考试不想在动脑筋了) ,没法简化,若是读者有想法请在评论区打出,谢谢!
2.main函数部分
这部分就是基础的输入str1,str2两个字符串和应用函数了
int main()
{
int locate;
char str1[256]={'\0'}, str2[256] = {'\0'};
gets_s(str1); gets_s(str2);
locate=strstr(str1, str2);
printf("%d", locate);
return 0;
}
3.完整代码
#include<stdio.h>
int strstr(char* str1, char* str2)
{
int location;
int locate = 1;
char* copy; copy = str2;
int num=0;
while (*str1 != '\0')
{
copy = str2;
num = 0;//num的实质是str2的长度
while (*str1 == *copy)//判断是否重复出现
{
copy++;
str1++;
locate++;
num++;
}
if (*copy == '\0')//str2已经完整出现
break;
if (num != 0) continue;//若可以循环locate和str1会加一,则不用再加
str1++; locate++;
}
if (*copy != '\0')location = -1;//str2未出现
else location = locate - num;//循环终止的位置减去str2的长度
return location;
}
int main()
{
int locate;
char str1[256]={'\0'}, str2[256] = {'\0'};
gets_s(str1); gets_s(str2);
locate=strstr(str1, str2);
printf("%d", locate);
}
总结
实际上是一道十分简单的题目,只需要基础的循环控制和一点点入门指针的知识,虽然简单,但在处理过程中有涉及到了一些细节,十分有趣。
本题目实际上来自笔者课程的一道题目,感觉颇有趣味故记录在此,如若读者您觉得有用,那我自然觉得分外高兴,若是没有,则不妨一笑而过,抱歉耽误您的几分钟
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)