《{送分}》自考本科c ++考试中的大题!
题目要求:
53.给定两个字符串对象S,P(P的长度小于S),实现一判断函数find,检测S是否完全包含P(串P是S的子串),若包含则返回P第一个字符在串S中的起始地址,否则返回-1。
#include<iostream. h>
#include<string>
class str{
string s,p;
public:str(string&a,string&b){s=a;p=b;}
...find(...);
};
请写出函数的过程(如果需要形式参数,请给出形参类型和数量,以及返回值类型)
我是这样写的:
#include<iostream.h>
#include<string>
using namespace std;
class str
{
string s;
string p;
public:
str(string &a, string &b) {s=a;p=b;}
int findl();
};
int str::findl()
{
if(s.length() >= p.length())
{
size_t nOffset = s.find(p,0);
return (int)nOffset;
}
else
{
return -1;
}
}
void main(void)
{
string a = "123abc";
string b = "3a";
str A(a,b);
A.findl();
cout << endl;
}
可以编译但是不是想要的结果,请给看看!谢谢!
[解决办法]
1.只输出了一个换行而已
cout << endl;
2.find()有可能返回npos,这是一个很大的数(也许是负的,变成int后),这时应该返回-1
3.即使结果正确,老师也不见得给分,find()函数应该自己实现吧
[解决办法]
int findstring(char *str1,char *str2)
{
int len1=strlen(str1);
int len2=strlen(str2);
if (len2==0)
{
return -1;
}
else
{
for (int i=0;i<len1;i++)
{
for (int j=0;j<len2;j++)
{
if (str1[i]==str2[j])
{
if (j==len2-1)
{
return i+1-len2;
}
i++;
continue;
}
break;
}
}
return -1;
}
}
[解决办法]
string a = "123abc";
string b = "3a";
string::size_type p = a.find(b); //find已经考虑各种情况,放心使用~_~
int pos = p != string::npos ? p : -1;
[解决办法]
KMP算法不就ok了?