Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
 Аватар для Baratro
4 / 4 / 1
Регистрация: 23.09.2009
Сообщений: 74

Strstr: Возвратить всю строку

18.12.2009, 17:03. Показов 5430. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
С помощью функции strstr ищем подстроку в строках файла. В результате успешного поиска необходимо вернуть не указательна на первую строку, с которого начинается вторая строка, а полностью всё содержание строки! Вопрос в том, как сиё реализовать.. (на данный момент нет идей по сему поводу)..
Заранее благодарю за помощь!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.12.2009, 17:03
Ответы с готовыми решениями:

Получить указатель на строку символов и возвратить длину строки в байтах.
Разработать функцию, которая будет получать указатель на строку символов и возвращать длину строки в байтах. Добавить в форму поле для...

Поместить в Edit всю строку из DbGrid
подскажите пожалуйста, как всю строчку поместить в эдит. как одну ячейку разобрался Edit1->Text =...

Как выделить в событии OnSelectCell всю строку, а не ячейку в StringGrid
Как выделить в событии OnSelectCell всю строку, а не ячейку в StringGrid Например, void __fastcall...

40
 Аватар для Ex_Soft
213 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481
18.12.2009, 17:39
Ну у Вас же первый параметр это и есть строка - вот его и возвращайте:
C++
1
2
if(strstr(StringFromFile,Substring))
  return(StringFromFile);
Или Вы подразумеваете что-то другое?
0
 Аватар для Зоти Сергей
230 / 227 / 65
Регистрация: 18.12.2009
Сообщений: 316
18.12.2009, 17:41
А если Вам нужно получить оставшуюся строку, после первого вхождения, то можно сделать, например так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
char * strstrnew(char * s1, char * s2)
{
    int s1length=strlen(s1);
        int s2length=strlen(s2);
        int matching;
 
        for(int i=0;i<s1length-s2length;i++)
        {
            matching=0;
            for(int j=0;j<s2length;j++)
                {
                    if(s1[i+j]!=s2[j])
                        break;
                        matching++;
                }
                if(matching==s2length)
                {
                    return &s1[i];
                }
        }
        return NULL;
}
0
 Аватар для Baratro
4 / 4 / 1
Регистрация: 23.09.2009
Сообщений: 74
18.12.2009, 17:43  [ТС]
Ex_Soft, Если сделать так, как вы написалаи, т.е., возвращать первый параметр, почему-то не возвращает, если она первая.. не знаете, с чем сиё может быть связано?
0
 Аватар для Ex_Soft
213 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481
18.12.2009, 17:46
Цитата Сообщение от Baratro Посмотреть сообщение
почему-то не возвращает, если она первая.. не знаете, с чем сиё может быть связано?
Проблемный кусок кода в студию. Только ж без фанатизма. А еще лучше - маленькую дрозофилку.
0
 Аватар для Baratro
4 / 4 / 1
Регистрация: 23.09.2009
Сообщений: 74
18.12.2009, 17:48  [ТС]
C++
1
2
3
4
5
6
7
8
9
if (ListBox1->ItemIndex) {
    ifstream f(name);
    while(f.getline(line, sizeof(line))){
    char *s1=line;
    char *s2=ListBox1->Items->Strings[ListBox1->ItemIndex].c_str();
    if (strstr(s1,s2)!=NULL){
    ShowMessage(s1);
    }
    } }
Выполняется при щелчке на кнопку.. Вроде бы, без фанатизма..
0
 Аватар для Ex_Soft
213 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481
18.12.2009, 18:17
/me думает: гм... Действительно - ничего космического... Получается - debugger в руки и вперед.
0
17 / 17 / 4
Регистрация: 03.12.2009
Сообщений: 103
18.12.2009, 18:18
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (ListBox1->ItemIndex >= 0)
{
  char *find;
  strcpy(find, ListBox1->Items->Strings[ListBox1->ItemIndex].c_str());
  ifstream f(name);
 
  while(f.getline(line, sizeof(line)))
  {
    if(strstr(line, find) != NULL)
    {
      ShowMessage(line);
    }
  }
}
0
 Аватар для Ex_Soft
213 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481
18.12.2009, 18:22
Цитата Сообщение от Baratro Посмотреть сообщение
почему-то не возвращает, если она первая..
Первая ГДЕ?
Цитата Сообщение от kdv Посмотреть сообщение
C++
1
if (ListBox1->ItemIndex >>> >= 0 <<<)
+1
0
 Аватар для Baratro
4 / 4 / 1
Регистрация: 23.09.2009
Сообщений: 74
18.12.2009, 18:27  [ТС]
C++
1
if (ListBox1->ItemIndex >= 0 )
ничего вообще не выводит (хотя, должно, 100процентно)

kdv, ваш код выдаёт ошибку
C++
1
strcpy(find, ListBox1->Items->Strings[ListBox1->ItemIndex].c_str());
в этой строке
0
17 / 17 / 4
Регистрация: 03.12.2009
Сообщений: 103
18.12.2009, 18:30
Цитата Сообщение от Baratro Посмотреть сообщение
kdv, ваш код выдаёт ошибку
и какую же??
0
 Аватар для Baratro
4 / 4 / 1
Регистрация: 23.09.2009
Сообщений: 74
18.12.2009, 18:34  [ТС]
Данную:
0
 Аватар для Ex_Soft
213 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481
18.12.2009, 18:37
Цитата Сообщение от kdv Посмотреть сообщение
C++
1
2
  char *find;
  strcpy(find, ListBox1->Items->Strings[ListBox1->ItemIndex].c_str());
а память выделять-то кто будет? (ну и удалить потом delete []find не забудьте)

P.S. c_str() - вещь, конечно, стремная, но, IMHO, в случае ТС - можно его юзать...
0
17 / 17 / 4
Регистрация: 03.12.2009
Сообщений: 103
18.12.2009, 18:49
Да, Виноват! Память опасная штучка )
0
 Аватар для Baratro
4 / 4 / 1
Регистрация: 23.09.2009
Сообщений: 74
18.12.2009, 18:49  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
char *s3=ListBox1->Items->Strings[ListBox1->ItemIndex].c_str();
 char *s4=new char [strlen(s3)+1];
  strcpy(s4, s3);
if (ListBox1->ItemIndex >= 0)
{
  ifstream f(name);
 
  while(f.getline(line, sizeof(line)))
  {
    if(strstr(line, s4) != NULL)
    {
      ShowMessage(line);
    }
  }
 
}
снова ошибка..несмотря на то, что память выделена..
0
17 / 17 / 4
Регистрация: 03.12.2009
Сообщений: 103
18.12.2009, 18:52
Цитата Сообщение от Ex_Soft Посмотреть сообщение
c_str() - вещь, конечно, стремная, но, IMHO, в случае ТС - можно его юзать...
В каком-каком случае??

c_str() используется только для чтения!!!

Добавлено через 2 минуты

2 Baratro,
Я же говорю, не надо делать так, это опасно:
AnsiString a;
char *b;
b = a.c_str();

Надо делать так:
AnsiString a;
char *b = new char[a.Length() + 1];
strcpy(b, a.c_str());
0
 Аватар для Ex_Soft
213 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481
18.12.2009, 18:53
Вы знаете, IMHO, Вы бы уже давным давно в debugger'е прошлись бы, сами все выяснили и отладили бы... Или Вы не умеете debugger'ом пользоваться?
0
 Аватар для Baratro
4 / 4 / 1
Регистрация: 23.09.2009
Сообщений: 74
18.12.2009, 18:59  [ТС]
Ex_Soft, простите, но debugger'ом я пользоваться не умею.. иначе, не тревожила бы других..

Добавлено через 1 минуту
kdv, разобралась, спасибо)
0
 Аватар для Ex_Soft
213 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481
18.12.2009, 19:01
Цитата Сообщение от kdv Посмотреть сообщение
В каком-каком случае??
в случае ТопикСтартера
Цитата Сообщение от kdv Посмотреть сообщение
c_str() используется только для чтения!!!
Спокойнее, Ипполит, спокойнее Укажите точно место в коде, где ТС что-то пишет по *.c_str()?
0
 Аватар для Baratro
4 / 4 / 1
Регистрация: 23.09.2009
Сообщений: 74
18.12.2009, 19:08  [ТС]
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
void __fastcall TForm1::Play()
{
if (MediaPlayer1->Position !=0) {
    timermin=timermin1;
    timersec=timersec1;
    Timer1->Enabled = true;
    MediaPlayer1->Play();
    SpeedButton8->Hint = "Приостановить";
    SpeedButton8->Tag = 1;
}
else {Timer1->Enabled = false;
    Label2->Caption = ListBox1->Items->Strings[ListBox1->ItemIndex];
    if (ListBox1->ItemIndex >= 0){
    ifstream f(name);
    AnsiString s3=ListBox1->Items->Strings[ListBox1->ItemIndex];
    char *s4=new char [s3.Length()+1];
    strcpy(s4, s3.c_str());
    while(f.getline(line, sizeof(line)))
    {
    if(strstr(line, s4) != NULL)
    {
      SoundPath = s4;
      MediaPlayer1->FileName = SoundPath;
    MediaPlayer1->Open();
    MediaPlayer1->Play();
    TrackInfo();
    ProgressBar1->Max = MediaPlayer1->TrackLength[1]/1000;
    ProgressBar1->Position = 0;
    timermin=0; timermin1=0;
    timersec=0; timersec1=0;
    Timer1->Enabled = true;
    SpeedButton8->Hint = "Приостановить";
    SpeedButton8->Tag = 1;
    }
      }
}
    }
Ругается, что не может найти путь к файлу.. может быть, кто-нибудь знает, с чем сиё связано..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.12.2009, 19:08
Помогаю со студенческими работами здесь

Как можно переместить всю строку в другую таблицу при помощи запроса
Как можно переместить всю строку в другую таблицу при помощи запроса зная значение одного поля? ADOQuery2-&gt;Close(); ...

Strstr не работает (определить вхождение символа в строку)
делаю так const char set_numbers = &quot;0123456789.&quot;; char c = '1'; if (strstr(set_numbers, &amp;c) true; else false; все время...

Возвратить строку из функции
Привет Всем! Пытаюсь разобраться с тем как можно возвратить строку из функции собственно вот мой код #include &lt;stdio.h&gt; ...

Как в функции возвратить строку?
Как возвратить в функции строку? При таком написании возвращает мусор, но не как не нолики?! char * seachfile(char str_source, char...

Возвратить строку без ненужных символов и слов
Применяю: $text='text1 &quot;word1&quot; text2 &quot;&quot; &quot;blahblahblah blah\n&quot; &quot;blahblahblah&quot; text1 &quot;word2&quot; text2...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru