Консультация № 172857
03.10.2009, 12:24
0.00 руб.
0 7 2
Помогите написать программу на С :
Функция -LastPos(s,s1).Поиск последнего вхождения подстроки s1 в строку s.

Обсуждение

Неизвестный
03.10.2009, 14:59
общий
это ответ
Здравствуйте, Faraon.

На всякий случай код программы не использует функций из string.h, хотя это и не оговаривалось особо.
Компилятор Borland C++ Ver. 3.1
Постарался подробно всё комментировать, но если вопросы всё-таки возникнут, то обращайтесь. Будем разбираться.

Приложение:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>

int len_s(char * s) // вычисление длины строки
{
for(int i=0;*s;i++,s++);
return(i);
}

int LastPos(char* s, char* s1) //Возвращает позицию последнего вхождения подстроки s1 в строку s,
// или 0 если вхождения нет
{
int pos=0;
char* cur=s; char* cur1=s1; //указатели на начало строк s и s1
for(int i=0;i<=len_s(s)-len_s(s1);i++,cur++) // просматриваем строку s с начала до конца минус длина s1
// перемещая указатель текущего положения cur по строке
{
if(*cur==*s1) // если найдено совпадение начального эл-та s1 с текущим эл-том cur
for(;*s1;s1++,cur++) // пробегаем в цикле сравнивая остальные символы s1 с текущими символами s
if(*cur!=*s1) если до конца s1 обнаружилось несовпадение с текущими эл-тами s
break; //выходим из цикла for(;*s1;s1++,cur++)
if(!*s1) // если вышли из цикла из-за того, что достигнут конец строки s1, то вхождение есть
pos=i+1; //запоминаем с какой позиции
cur=s+i; // восстанавливаем значения указателей на текущее положение s
s1=cur1; // и на s1
}
return(pos);
}

void main(void)
{
char s1[20], s[20];
clrscr();
scanf("%s",s1);
scanf("%s",s);
printf("\Последнне вхождение строки %s в строку %s на %d-й позиции",s1,s,LastPos(s,s1));
getch();
}
давно
Посетитель
7438
7205
05.10.2009, 13:15
общий
это ответ
Здравствуйте, Faraon.
Предлагаю другое решение: используем функцию strstr()

Приложение:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>


int LastPos(char* s, char* s1) //Возвращает позицию (с 1) последнего вхождения подстроки s1 в строку s,
// или 0 если вхождения нет
{
char *Prev,*Curr;

for (Prev=NULL,Curr=strstr(s, s1); Curr; Curr=strstr((Prev=++Curr), s1));

if (Prev)
return (Prev-s);
return 0;
}

void main(void)
{
char s1[20], s[20];
scanf("%s",s1);
scanf("%s",s);
printf("\nПоследнее вхождение строки %s в строку %s на %d-й позиции\n",s1,s,LastPos(s,s1));
getch();
}
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
06.10.2009, 22:29
общий
Проблема заключается в том, что в строке могут присутствовать пробелы....подскажыте что тогла делать...
Неизвестный
06.10.2009, 22:56
общий
Faraon:
Цитата: 244291
Проблема заключается в том, что в строке могут присутствовать пробелы

Как мне кажется, пробел (' ', код - 32) не выделяется ни в одном из двух первых приведённых ответов как какой-то особый символ. Так что с ним нет никаких проблем, как и символом, например 'a', 'c' или любым другим.
Неизвестный
06.10.2009, 23:03
общий
Когда я запускаю программу и ввожу значение подстроки : d , а потом значение строки "s d" то ответ выдает 0
Неизвестный
07.10.2009, 10:42
общий
Faraon:
Вы оказались совершенно правы! Приношу свои извинения за то, что невнимательно тестировал.
Функция работает корректно. Проблема с пробелом в строке возникает не в функции LastPos, а в main.
Когда мы читаем строку "s d" с помощью scanf, в строковую переменную попадает только "s", т. е. чтение прерывается на первом "пробельном" символе (пробел, табуляция или возврат каретки). Это "лечится" заменой scanf("%s",s1); scanf("%s",s); на gets(s1); gets(s); в функции main.
Неизвестный
07.10.2009, 12:28
общий
Большое спасибо за помощь!
Форма ответа