Си. Строки и подстроки.
Помогите пожалуйста.
На Си надо:
"Функция находит в строке заданную подстроку и возвращает указатель на неё. С использованием этой функции найти все вхождения подстроки в строке".
Спасибо заранее.
Приветствую.
Помогите пожалуйста.
На Си надо:
"Функция находит в строке заданную подстроку и возвращает указатель на неё. С использованием этой функции найти все вхождения подстроки в строке".
Спасибо заранее.
Либо покажи пожалуйста, что ты сам сделал (хотя бы попытки), либо пожалуйста перемести свою тему в раздел "Студентам".
Приветствую.
Помогите пожалуйста.
На Си надо:
"Функция находит в строке заданную подстроку и возвращает указатель на неё. С использованием этой функции найти все вхождения подстроки в строке".
Спасибо заранее.
Подсказка: strstr()
Либо покажи пожалуйста, что ты сам сделал (хотя бы попытки), либо пожалуйста перемести свою тему в раздел "Студентам".
Итак. На Builder'e я писал и всё работало. Проблема в том, что:
1. Си за 1 день мне не выучить =)
2. AnsiString в Си нет.
int seach_substr(AnsiString str, AnsiString substr, int pos)
{
int pos_substr = 0;
for(int i = pos; i <= str.Length()-substr.Length(); i++)
{
for(int j = 0; j < substr.Length(); j++)
{
if(str[j+i] != substr[j+1])
{
pos_substr = 0;
break;
}
else
{
pos_substr = i;
}
}
if(pos_substr)
break;
}
return pos_substr;
}
//------------------------------------------------
// поиск подстрок
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString str = Edit1->Text;
AnsiString substr = Edit2->Text;
int kolvo = 0;
int pos = 0;
for(int i = 1; i < str.Length(); i++)
{
pos = seach_substr(str, substr, i);
if(pos)
{
kolvo += 1;
i += pos;
}
}
int * vhod = new int[kolvo]; //массив содержащий все позиции входа подстроки
kolvo = 0, pos = 0;
for(int i = 1; i < str.Length(); i++)
{
pos = seach_substr(str, substr, i);
if(pos)
{
vhod[kolvo] = pos;
kolvo += 1;
i += pos;
}
}
AnsiString substr_pos = "";
for(int i = 0; i < kolvo; i++)
substr_pos += IntToStr(vhod)+" ";
Edit3->Text = substr_pos;
// после завершения работы не забываем освобождать память
delete [] vhod;
}
Если всё ещё актуален вопрос о переносе в "Студентам", то дайте знать.
Подсказка: strstr()
char * strstr(const char *s1, const char * s2);
Функция strstr() определяет лишь первое вхождение строки s2 в строку s1, все остальные включения уже не учитываются.
Подскажите, пожалуйста ещё что-нибудь.
char * strstr(const char *s1, const char * s2);
Функция strstr() определяет лишь первое вхождение строки s2 в строку s1, все остальные включения уже не учитываются.
Подскажите, пожалуйста ещё что-нибудь.
Ну так используй strstr несколько раз. Она те при первом возврате возвращяет указатель на первое совпадение,наращиваеш указатель на один символ и этот указатель вставляй снова в strstr в качестве первого аргумента а второй оставляй прежним то есть искомую строку и далее если есть такие совпадения она те возвратит следующее совпадение и так пока не возвратит NULL.