Остальное условие никогда не достигается - PullRequest
3 голосов
/ 30 марта 2011

Кажется, у меня проблемы с написанием функции поиска строки.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
  • Сравните этот сегмент со строкой2
  • Если они совпадают, увеличьте счетчик и проверьте адрес следующего массива
  • Если нет, то строки не совпадают иВы еще не нашли сегмент в своей строке, и совпадение становится равным 0.
  • Если совпадение не найдено, переместите ячейку массива в начале и конце позиции 1.
  • Если match = 1, вернутьbegPos
  • Повторяйте 6 предыдущих шагов, пока endPos не достигнет конца строки 1.
  • Если endPos достигнет конца строки1, не найдя строку 2 в строке1, верните -1. ​​

Проблема, с которой я столкнулся, заключается в том, что

while (match == 1)
{
    if (tempStr[count] == string2[count]) {
         if (count < strlength(string2)) count++;
         else break;
    }
    else match = 0;
}

, кажется, никогда не достигает условия else.Возвращаемое значение всегда представляется значением, с которым инициализируется begPos.Это домашнее задание, но я переписывал его несколько раз, используя разные методы, например, для циклов, и выполнил несколько пробных прогонов и, похоже, не смог решить проблему.Любой свет, который вы можете пролить, будет очень полезен.

Приветствия,

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 ]

5 голосов
/ 30 марта 2011

У меня есть только одна точка для поднятия.

Как вы думаете, tempStr настраивается на что-нибудь полезное?

Линия char *tempStr; устанавливает ее на то, что случилосьв стеке в то время, пока C, из-за отсутствия «правильного» прохода по ссылке, не может изменить его с помощью вызова:

strmid(string1, begPos, endPos, tempStr);

Чтобы изменить указатель, вы должны были бы передать &tempStr, а не tempStr.

Итак, мне кажется, что ваш tempStr не указывает ни на что пригодное для использования.


И, исходя из добавленного вами strmidфункция, эта программа определенно находится в классе "неопределенного поведения".Быстрое решение, хотя и клуджое, должно было бы изменить:

char *tempStr;

на:

char tempStr[1000];

Это может не исправить все ваши проблемы (и этоможет привести к переполнению буфера), но это, по крайней мере, даст вам четко определенную программу.

2 голосов
/ 30 марта 2011

2 балла:

  • вам нужно переинициализировать count до нуля до внутреннего while
  • вам нужно переинициализировать match до 1 до внутреннего while

Если вы этого не сделаете, то, если первая итерация не совпадает, совпадение никогда не будет равно 1, и при подсчете вы будете проверять память, которую вы не знаете, содержимого.

Это в дополнение к проблеме, отмеченной paxdiablo.

0 голосов
/ 30 марта 2011

Просто установите соответствие в 1 и считайте до нуля в начале цикла и выделите достаточно памяти для tempStr *:

int endPos = strlen (string2) -1; char * tempStr = (char *) malloc ((size_t) (endPos + 1));

while (endPos <= strlength (string1) -1) { кол = 0; матч = 1; ... </p>

0 голосов
/ 30 марта 2011

if (match == 1) return begPos; else {begPos ++; endPos ++; }

совпадение всегда будет 1, чтобы попасть сюда

0 голосов
/ 30 марта 2011

Посмотрите на этот код:

   if (tempStr[count] == string2[count]) {
       if (count < strlength(string2)) count++;
      else break; }
   else match = 0;

Вы видите, как совпадение никогда не будет установлено на ноль?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...