Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Помогите отладить программку!!


Автор: ЛидОК 25.5.2008, 16:42
Задание:
Функция находит в строке заданную подстроку и возвращает динамический массив указателей на все вхождения этой подстроки.



Код

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>

char **change(char *str1, char *str2);
void main()
{

     clrscr();
     char str1[256];
     char str2[256];
     char mas1[99];

    printf("Введите основную строку \n");
    gets(str1);
    printf("Введите подстроку\n");
    gets(str2);

     printf("Вхождение данной подстроки\n");
     char **res = change(str1, str2);
     for(int i = 0 ;i < 10 ; i++)
    {
     if(res[i]!=NULL) printf("%s\n", res[i]);
    }
     getch();
}
char **change(char *str1, char *str2)
{
     char **ss=(char **) malloc (10*sizeof(char*));
     for(int f=0; f<10; f++)
     {
     ss[f]=0;
     }

     int mas=0;
     int poz=0;            // позиция указателя в подстроке
     int flag=0;
     int n=0;             // число совпавших символов
     int dir;
     int j;

 for(int i=0; i<=strlen(str1)-strlen(str2); i++) //отмечаем начало проверяемого
 {                                               //отрезка

   flag=0;
   //--Цикл посимвольной проверки на совпадение первой и 2-ой строки--
   for(j=i, poz=0; j<i+strlen(str2) && flag==0; j++, poz++)
    {
     if(str1[j]==str2[poz])
     {
        n++;       // Увеличиваем число совпавших символов
        if(n==strlen(str2))        // Если равно подстроке-запоминаем положение
         {
         ss[mas] = &str1[i];
         mas++;
         n=0;
         }
         else
        {
         flag=1;
          n=0;
        }
     }

   }
   return ss;
}
}



M
JackYF
Пользуемся кнопкой "Код".


Она почему-то не работает!!!! Помоите исправить ошибки в ней, чтоб работала!!!!! ПОЖАЛУЙСТА!!!!!! smile 

Автор: JackYF 25.5.2008, 17:19
Цитата(ЛидОК @  25.5.2008,  15:42 Найти цитируемый пост)
Она почему-то не работает!

Слишком общая характеристика. Что именно не работает?

Автор: ЛидОК 25.5.2008, 17:25
Пишит, что: Function should return a value

Как исправить?

Добавлено через 12 минут и 51 секунду
Я когда запускаю программ:
Пишит:

Введите основную строку
Я ввожу: askgassdasasasty

Введите подстроку
Я ввожу: as

Программа должа мне вывести на экран номер позиции, где находится моя подстрока в подстроке.

А у меня программа сразу выходит после вывода на экран "Вхождение данной подстроки".

Автор: JackYF 25.5.2008, 21:41
Цитата(ЛидОК @  25.5.2008,  16:25 Найти цитируемый пост)
А у меня программа сразу выходит после вывода на экран "Вхождение данной подстроки".


Цитата(ЛидОК @  25.5.2008,  15:42 Найти цитируемый пост)
{
     if(res[i]!=NULL) printf("%s\n", res[i]);
    }

Значит, это условие никогда не срабатывает. Возьми отладчик и проверь, почему.

Автор: ЛидОК 25.5.2008, 21:52
А где взять отладчик? А может проблема в чем-нибудь другом?

Автор: mes 25.5.2008, 22:16
Цитата(ЛидОК @  25.5.2008,  16:42 Найти цитируемый пост)
   }
   return ss;
}
}

a может все таки
Код

  }   
 }
  return ss;
}

Автор: ЛидОК 26.5.2008, 23:30
Цитата

mes Дата 25.5.2008, 22:16 


Теперь у меня нет ошибок в программе))) СПАСИБО!!!! 
Но она почему-то опять ничего не выводит после сообщения"Вхождение данной подстроки".
Помогите понять почему?! smile 

Автор: mes 26.5.2008, 23:55
Цитата(ЛидОК @  25.5.2008,  16:42 Найти цитируемый пост)
 
if(str1[j]==str2[poz]) // при совпадении символа
     {
        n++;       
        if(n==strlen(str2))        // Если равно подстроке-запоминаем
         {
         ss[mas] = &str1[i];  //  при печати этой строки будет выведена строка от текушей позиции до конца первой строки
                                           // при удалени str1 весь массив становится невалидным
         mas++;
         n=0;
         }
         else                                // иначе
        {
         flag=1;                       // говорим что закончить цикл ?? т .е выходим при первом совпадении символов ничего не запомнив ??
          n=0;
        }
     }


Добавлено через 3 минуты и 14 секунд
плюс нехорошо выделять внутри функции и отдаватэ указатель на нее наружу
и функцию лучше определить как change(const char *str1, char char *str2)  и соответствено добавить консты внутри функции

Автор: mes 27.5.2008, 00:35
лови.. доделаешь под свои нужды

Код

void OnFoundSubString (const char* begin, const char *end)
{
    printf ("ura ! \n");
};
void FindSubString (const char* str, const char * sub)
{
    const char *pe = str+ strlen(str)-strlen(sub);

    for (const char* p =str; p<=pe; ++p)
    {
        if (*p==*sub)
           {
               const char* p1=p; bool flag =true;
               for (size_t j=0; j<strlen(sub); ++j, ++p1 )
               {
                    if (*p1!=sub[j]) {flag = false; break; }
               }
               if (flag) OnFoundSubString (p, p1); // нашли
            }
    };
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)