我似乎在编写字符串搜索功能时遇到问题。 strlength和strmid都是以前写过的函数,经过测试并且正在运行。
int strfind(char * string1, char * string2)
{
/* if string1 contains the substring string2 returns
the starting position of string2 in string1
otherwise returns -1
e.g. strinc("hello world","wor") returns 6
strinc("hello world","war") returns -1
*/
int begPos = 0, endPos, count = 0, match = 1;
char *tempStr;
endPos = strlength(string2)-1;
while (endPos <= strlength(string1)-1)
{
strmid(string1, begPos, endPos, tempStr);
while (match == 1)
{
if (tempStr[count] == string2[count]) {
if (count < strlength(string2)) count++;
else break;
}
else match = 0;
}
if ( match == 1 ) return begPos;
else { begPos++;
endPos++; }
}
return -1;
}
算法应该类似于
我遇到的问题是
while (match == 1)
{
if (tempStr[count] == string2[count]) {
if (count < strlength(string2)) count++;
else break;
}
else match = 0;
}
似乎永远不会达到else子句。返回的值似乎总是begPos初始化的值。这是一个家庭作业,但我已经使用不同的方法重写了几次,例如for循环,并做了多次干运行,似乎无法解决问题。你可以放下任何光线都会非常感激。
干杯,
espSquall
strmid函数
void strmid(char * string1, int start, int end, char * string2)
{
/* copies the elements of string1 from start to end
to string2 */
int len, count2 = 0;
for (len = start; len <= end; len++)
{
string2[count2] = string1[len];
count2++;
}
string2[count2] = '\0';
}
答案 0 :(得分:5)
我只有一点要提。
您认为tempStr
如何设置为有用的东西?
行char *tempStr;
将它设置为当时堆栈上发生的任何事情,而C缺少“正确”的引用传递,不能通过调用更改它:
strmid(string1, begPos, endPos, tempStr);
要更改指针,您必须传入&tempStr
而不是tempStr
。
因此,在我看来,您的tempStr
并未指向可用的任何内容。
并且,基于您添加的strmid
函数,此程序肯定在“未定义的行为”类中。快速解决方案虽然很糟糕,但却会改变:
char *tempStr;
为:
char tempStr[1000];
这可能无法解决所有你的问题(并且它会引入缓冲区溢出的可能性),但它至少会为你提供一个明确定义的程序。
答案 1 :(得分:2)
2分:
count
while
match
while
重新初始化为1
如果你不这样做,那么如果第一次迭代不匹配,匹配将永远不再是1,并且count将让你检查你不知道内容的内存。
这是paxdiablo注意到的问题的补充。
答案 2 :(得分:0)
看看这段代码:
if (tempStr[count] == string2[count]) {
if (count < strlength(string2)) count++;
else break; }
else match = 0;
你能看到匹配永远不会被设置为零吗?
答案 3 :(得分:0)
if(match == 1)return begPos; else {begPos ++; endPos ++; }
匹配将始终为1,以便它到达
答案 4 :(得分:0)
重新设置匹配为1并在循环开始时计数为零并为tempStr *分配足够的内存:
int endPos = strlen(string2)-1; char * tempStr =(char *)malloc((size_t)(endPos + 1));
while(endPos&lt; = strlength(string1)-1) { 计数= 0; 匹配= 1; ...