Форум программистов, компьютерный форум CyberForum.ru

Найти в строке два одинаковых фрагмента длиной более 5 символов и возвратить индекс начала первого из них - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
sergeevichvn
0 / 0 / 0
Регистрация: 02.02.2014
Сообщений: 8
02.02.2014, 21:31     Найти в строке два одинаковых фрагмента длиной более 5 символов и возвратить индекс начала первого из них #1
Всем добрый вечер.
Собственно нужна ваша помощь, есть условие:
"Найти в строке два одинаковых фрагмента (не включающих в себя пробелы) длиной более 5 символов и возвратить индекс начала первого из них (т.е. для “aaaaaabcdefgxxxxxxbcdefgwwwww” вернуть n=6 - индекс начала “bcdefg”)."
Кто может помочь с решением задачи, написанием кода? Ну или хотя бы доходчиво объяснить, что от меня требуется, как должна работать программа?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.02.2014, 21:31     Найти в строке два одинаковых фрагмента длиной более 5 символов и возвратить индекс начала первого из них
Посмотрите здесь:

Найти в строке два одинаковых фрагмента (не включая пробелы) длиной более 5 символов C++
C++ Дана строка длиной не более 80 символов, оканчивающаяся точкой. Подчеркнуть все гласные буквы в строке
10.31. Даны два предложения, в которых имеются буквы ш. Найти, в каком из них эга буква имеет больший порядковый номер (при счете от начала предложени C++
C++ среди чисел k,l,r два одинаковых,а в третье отлично от них.Переменной n присвоить значение числа,отличного от двух одинаковых
C++ В каждой строке найти минимальный элемент, затем среди них найти максимальное и вывести на экран индекс этого элемента
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1787
Регистрация: 18.12.2011
Сообщений: 14,197
Завершенные тесты: 1
02.02.2014, 21:44     Найти в строке два одинаковых фрагмента длиной более 5 символов и возвратить индекс начала первого из них #2
C
1
2
3
4
5
6
7
8
9
10
11
#include <string.h>
#include <stdio.h>
int main()
{
    char str[]=“aaaaaabcdefgxxxxxxbcdefgwwwww” ;
    char srs[]=“bcdefg”;
    int pos;
    pos=strstr(str,src);
    printf("позиция фрагмента %s =%d",srs,pos);
    retun 0;
}
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,717
Записей в блоге: 3
03.02.2014, 00:59     Найти в строке два одинаковых фрагмента длиной более 5 символов и возвратить индекс начала первого из них #3
sergeevichvn, могут ли перекрываться фрагменты:
"тратратр" ?
Fene4ka_
84 / 84 / 16
Регистрация: 24.01.2014
Сообщений: 1,142
03.02.2014, 02:01     Найти в строке два одинаковых фрагмента длиной более 5 символов и возвратить индекс начала первого из них #4
zss, строка должна быть любой, в вашем же случае такое работать не будет
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1787
Регистрация: 18.12.2011
Сообщений: 14,197
Завершенные тесты: 1
03.02.2014, 13:37     Найти в строке два одинаковых фрагмента длиной более 5 символов и возвратить индекс начала первого из них #5
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
строка должна быть любой
Так добавьте команду ввода строки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <string.h>
#include <stdio.h>
int main()
{
    int pos;
    char str[100];
    char srs[50];
    puts("Где ищем:");
    gets(str);
    puts("Что ищем:");
    gets(srs);
    pos=strstr(str,src);
    printf("позиция фрагмента %s =%d",srs,pos);
    retun 0;
}
Fene4ka_
84 / 84 / 16
Регистрация: 24.01.2014
Сообщений: 1,142
03.02.2014, 16:51     Найти в строке два одинаковых фрагмента длиной более 5 символов и возвратить индекс начала первого из них #6
zss, также на сколько я понимаю, мы не должны вводить, что ищем, а оно должно само найти, что ищем ...
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,717
Записей в блоге: 3
03.02.2014, 16:54     Найти в строке два одинаковых фрагмента длиной более 5 символов и возвратить индекс начала первого из них #7
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
zss, также на сколько я понимаю, мы не должны вводить, что ищем, а оно должно само найти, что ищем ...
Так функцию же показали. А из строки ввести разве сложнее чем с консоли? Вот тут много лишнего, но как рабочий вариант (не проверял дотошно ) :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
 
int main()
{
char sourcestr[]="olo lol tratratrumbumbumubumbum bum bum bum";
const size_t size_compiring_str = 5;
char compiring_str[size_compiring_str+1]={0};
 
size_t pos_cmp=0;
size_t pos_fnd=pos_cmp+1;
char *find_pos=0;
char *rezult_pos=0;
size_t size_sourcestr = sizeof(sourcestr)/sizeof(char);
while(pos_cmp < size_sourcestr){
while(pos_fnd < size_sourcestr){
find_pos=0;
rezult_pos=0;
strncpy(compiring_str, &sourcestr[pos_cmp], size_compiring_str); 
if((find_pos = strstr(&sourcestr[pos_fnd], compiring_str))!=0){
rezult_pos=&sourcestr[pos_cmp]; 
    break;
}
pos_fnd++;
}
if(find_pos!=0){
    break;
}
pos_cmp++;
pos_fnd=pos_cmp+1;
}
if(find_pos){
cout<<"the first entry is "<<rezult_pos<<" at pos "<<pos_cmp<<" in "<<sourcestr<<endl;
cout<<"and the substring is "<< find_pos;
}
else
cout<<"position is not found";
 
cout<<endl;
system("pause");
return 0;
}
Если перекрываться могут, но ТС молчит, как партизан.
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1787
Регистрация: 18.12.2011
Сообщений: 14,197
Завершенные тесты: 1
03.02.2014, 17:16     Найти в строке два одинаковых фрагмента длиной более 5 символов и возвратить индекс начала первого из них #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <string.h>
#include <stdio.h>
int main()
{
    int L;
    char str[100];
    char srs[7],*pos;
    puts("Где ищем:");
    gets(str);
    L=strlen(str);
    for(int i=6;i<L-6;i++)
    {
        strncpy(srs,str+i-6,6); // берем очередные 6 символов из строки
        srs[6]=0;
        pos=strstr(str+i,srs); // ищем после последнего взятого символа
        if(pos!=NULL)
           printf("позиция второго фрагмента %s =%d",srs,(int)(pos-str));
    }
    return 0;
}
sergeevichvn
0 / 0 / 0
Регистрация: 02.02.2014
Сообщений: 8
03.02.2014, 23:51  [ТС]     Найти в строке два одинаковых фрагмента длиной более 5 символов и возвратить индекс начала первого из них #9
Я так понимаю, мы с клавиатуры вводим строку, в этой строке нужно найти два одинаковых фрагмента из 5 символов, в переменную возвращается индекс, после которого начинается этот фрагмент.

Что значит перекрываются?
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,717
Записей в блоге: 3
04.02.2014, 01:37     Найти в строке два одинаковых фрагмента длиной более 5 символов и возвратить индекс начала первого из них #10
Цитата Сообщение от sergeevichvn Посмотреть сообщение
Что значит перекрываются?
То есть буквально. Но не абсолютно. Я же пример в вопросе привёл и в коде тоже два фрагмента перекрываются. Первый содержит несколько символов следующего:
tratratr
tratr это фрагмент, а перекрываются они по tr.
Поскольку Вы не оговорили этот момент, то следует полагать, что перекрываться они могут. Но в задании, возможно, это оговорено, поэтому я и спрашивал. Впрочем, для случая неперекрывающихся фрагментов переделать пара пустяков. Сдвигать в первой итерации не на 1, а на 5.
sergeevichvn
0 / 0 / 0
Регистрация: 02.02.2014
Сообщений: 8
04.02.2014, 02:32  [ТС]     Найти в строке два одинаковых фрагмента длиной более 5 символов и возвратить индекс начала первого из них #11
Задание скопировано, это все условие, которое давалось.
То что написали Вы, кажется не совсем то, если я покажу такой код препод офигеет. Мы азы только прошли
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,717
Записей в блоге: 3
04.02.2014, 02:43     Найти в строке два одинаковых фрагмента длиной более 5 символов и возвратить индекс начала первого из них #12
Цитата Сообщение от sergeevichvn Посмотреть сообщение
Задание скопировано, это все условие, которое давалось.
То что написали Вы, кажется не совсем то, если я покажу такой код препод офигеет. Мы азы только прошли
Значит могут перекрываться. Что касается кода, то чем он короче, тем красивее и лучше, обычно. Такой код, который предложил zss, новичёк конечно может написать. Но это либо случайно или очень талантливый новичёк (имхо).
А что касается:
Цитата Сообщение от sergeevichvn Посмотреть сообщение
препод офигеет.
то это же его работа.
Главное, что бы Вы понимали, что происходит и почему, и разобравшись смогли написать что-то осмысленное(имхо).
sergeevichvn
0 / 0 / 0
Регистрация: 02.02.2014
Сообщений: 8
04.02.2014, 03:00  [ТС]     Найти в строке два одинаковых фрагмента длиной более 5 символов и возвратить индекс начала первого из них #13
Цитата Сообщение от IGPIGP Посмотреть сообщение
Главное, что бы Вы понимали, что происходит и почему, и разобравшись смогли написать что-то осмысленное(имхо).
#include <string.h> // Подключаем библиотеки
#include <stdio.h> // Подключаем библиотеки
int main()
{
int L; // Объявляем переменную L типа integeer
char str[100]; //создаем массив символьного типа
char srs[7],*pos; //создаем массив символьного типа, + переменную pos (НЕ понятно, что значит звездочка)
puts("Где ищем:"); //вывод строки на экран, наверное лучше printf
gets(str); // получаем строку с клавиатуры и записываем в массив str
L=strlen(str); //присваиваем переменной l значение длинны введенной строки
for(int i=6;i<L-6;i++) // цикл выполняется пока i меньше длина строки-6 симвоолов
{
strncOpy(srs,str+i-6,6); // берем очередные 6 символов из строки // тут не совсем понятно, что в скобках
srs[6]=0; // присваиваем 6 элементу массива 0?
pos=strstr(str+i,srs); // ищем после последнего взятого символа //что значит strstr, почему два раза и что в скобках?
if(pos!=NULL) // условие, если переменная пос не равна 0, выводим на экран
printf("позиция второго фрагмента %s =%d",srs,(int)(pos-str));
}
return 0;
}
Fene4ka_
84 / 84 / 16
Регистрация: 24.01.2014
Сообщений: 1,142
04.02.2014, 03:10     Найти в строке два одинаковых фрагмента длиной более 5 символов и возвратить индекс начала первого из них #14
sergeevichvn, а в теги С++ не судьба была вставить ?
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,717
Записей в блоге: 3
04.02.2014, 03:29     Найти в строке два одинаковых фрагмента длиной более 5 символов и возвратить индекс начала первого из них #15
sergeevichvn, в левом верхнем углу окна редактора сообщений, средняя строка линейки начинается символом С++. Ткнув его вы получите в окне пару тегов (открывающий/закрывающий) форматирования кода:
[CPP][/CPP]. Поставив курсор между ними и скопировав код, Вы сможете представить его, так:
C++
1
int *a;
звёздочка это символ, специфицирующий объявляемый тип, как указатель в данном объявлении. В выражениях это может быть знак операции умножения или разадресации.
O в strncpy, действительно не нужно, но Вам же показывают идею, а не дают, непременно, работающий код. Отвечающий может не располагать временем, например. Помощь ведь не в том, чтобы сделать за Вас работу, а в том, чтобы помочь Вам её сделать.
И ещё о окне форума и его фичах. Внизу под каждым постом, есть кнопка "спасибо". Это не обязательная процедура, но обычно ею пользуются. Чтобы потренироваться, нажмите здесь:
Найти в строке два одинаковых фрагмента длиной более 5 символов и возвратить индекс начала первого из них
демонстрируя признательность автору поста. Это будет, просто, нормально.
sergeevichvn
0 / 0 / 0
Регистрация: 02.02.2014
Сообщений: 8
04.02.2014, 03:42  [ТС]     Найти в строке два одинаковых фрагмента длиной более 5 символов и возвратить индекс начала первого из них #16
Спасибо ребят, дальше сам попробую разобраться
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1787
Регистрация: 18.12.2011
Сообщений: 14,197
Завершенные тесты: 1
04.02.2014, 17:39     Найти в строке два одинаковых фрагмента длиной более 5 символов и возвратить индекс начала первого из них #17
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <string.h> // Подключаем библиотеки
#include <stdio.h> // Подключаем библиотеки
int main()
{
   int L; // Объявляем переменную L типа integeer
   char str[100]; //создаем массив символьного типа
   char srs[7]; //создаем массив символьного типа, 
   char *pos;//+ переменную pos - указатель на char. В ней будет храниться адрес начала фрагмента
   puts("Где ищем:"); //вывод запроса на экран,  printf не лучше,т.к. в строке нет символов форматирования 
   gets(str); // получаем строку с клавиатуры и записываем в массив str
   L=strlen(str); //присваиваем переменной l значение длинны введенной строки
   for(int i=6;i<L-6;i++) 
   // цикл начинаем с конца первого 6-символьного фрагмента и выполняется пока i меньше длина строки-длина фрагмента
   {
        strncopy(srs,str+i-6,6); // берем очередные 6 символов из строки 
// тут не совсем понятно, что в скобках: srs - куда копируем,str+i-6 начиная откуда копировать,6 - не более 6 символов.
        srs[6]=0; // присваиваем 6 элементу массива 0. Ноль - это признак конца строки.
        pos=strstr(str+i,srs); // ищем после последнего взятого символа 
//что значит strstr - функция поиска подстроки srs В строке str начиная с i-го символа
        if(pos!=NULL) // если указатель pos нулевой, то такой подстроки нет
               printf("позиция второго фрагмента %s =%d",srs,(int)(pos-str));
   }
   return 0;
}
sergeevichvn
0 / 0 / 0
Регистрация: 02.02.2014
Сообщений: 8
04.02.2014, 23:48  [ТС]     Найти в строке два одинаковых фрагмента длиной более 5 символов и возвратить индекс начала первого из них #18
Цитата Сообщение от zss Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <string.h> // Подключаем библиотеки
#include <stdio.h> // Подключаем библиотеки
int main()
{
   int L; // Объявляем переменную L типа integeer
   char str[100]; //создаем массив символьного типа
   char srs[7]; //создаем массив символьного типа, 
   char *pos;//+ переменную pos - указатель на char. В ней будет храниться адрес начала фрагмента
   puts("Где ищем:"); //вывод запроса на экран,  printf не лучше,т.к. в строке нет символов форматирования 
   gets(str); // получаем строку с клавиатуры и записываем в массив str
   L=strlen(str); //присваиваем переменной l значение длинны введенной строки
   for(int i=6;i<L-6;i++) 
   // цикл начинаем с конца первого 6-символьного фрагмента и выполняется пока i меньше длина строки-длина фрагмента
   {
        strncopy(srs,str+i-6,6); // берем очередные 6 символов из строки 
// тут не совсем понятно, что в скобках: srs - куда копируем,str+i-6 начиная откуда копировать,6 - не более 6 символов.
        srs[6]=0; // присваиваем 6 элементу массива 0. Ноль - это признак конца строки.
        pos=strstr(str+i,srs); // ищем после последнего взятого символа 
//что значит strstr - функция поиска подстроки srs В строке str начиная с i-го символа
        if(pos!=NULL) // если указатель pos нулевой, то такой подстроки нет
               printf("позиция второго фрагмента %s =%d",srs,(int)(pos-str));
   }
   return 0;
}
Огромное спасибо, если сдам, готов пополнить ваш баланс кармы

Добавлено через 52 минуты
15 31 D:\Безымянный1.cpp [Error] 'strncopy' was not declared in this scope - ошибка на строке strncopy(srs,str+i-6,6);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2014, 11:13     Найти в строке два одинаковых фрагмента длиной более 5 символов и возвратить индекс начала первого из них
Еще ссылки по теме:

C++ В квадратной матрице найти номер первого отрицательного элемента в строке и составить из них массив.
Найти координаты первого вхождения в заданную строку подстроки, состоящей из двух одинаковых заданных символов C++
Текст, состоящий не более чем из 255 символов, разбить на строки длиной не более 50 символов в строке C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1787
Регистрация: 18.12.2011
Сообщений: 14,197
Завершенные тесты: 1
05.02.2014, 11:13     Найти в строке два одинаковых фрагмента длиной более 5 символов и возвратить индекс начала первого из них #19
Цитата Сообщение от sergeevichvn Посмотреть сообщение
D:\Безымянный1.cpp [Error] 'strncopy' was not declared in this scope - ошибка на строке strncopy(srs,str+i-6,6);
Не знаю как оно получилось, но в оригинале было правильно (без буквы o)
C++
1
strncpy(srs,str+i-6,6);
Похоже, это вы ее вставили в 13 посте.
Yandex
Объявления
05.02.2014, 11:13     Найти в строке два одинаковых фрагмента длиной более 5 символов и возвратить индекс начала первого из них
Ответ Создать тему
Опции темы

Текущее время: 16:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru