永远不会达到其他条款

时间:2011-03-30 13:05:29

标签: c

我似乎在编写字符串搜索功能时遇到问题。 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;
}

算法应该类似于

  • 获取begPos和endPos之间的字符串段
  • 将此细分与string2进行比较
  • 如果它们相同,则递增计数并检查下一个数组地址
  • 如果没有,则字符串不匹配,并且您没有在字符串中找到该段 然而匹配变为0。
  • 如果未找到匹配项,请移动开始和结束位置1阵列单元格。
  • 如果匹配= 1,则返回begPos
  • 重复前面的6个步骤,直到endPos到达string1的末尾。
  • 如果endPos到达string1的末尾而没有在string1中找到string2, 返回-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';
}

5 个答案:

答案 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;       ...