Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

strstr в языке СИ(не C++)

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Первый вопрос] >> strstr в языке СИ(не C++)
Имя
Сообщение << Старые топики   Новые топики >>
strstr в языке СИ(не C++) - 2012-05-06 14:14:45.710000   
anon_x

Сообщений: 17
Оценки: 0
Присоединился: 2011-12-05 20:48:32.280000
Прошу помочь тех, кто разбирается в Си.
Нужно реализовать на языке Си функцию strstr.
Функция ищет в строке s1 первое вхождение строки s2. Обе строки передаются из main.
Объявление функции: char *strstr (char *s1, char *s2)
Функция должна вернуть номер символа либо NULL, например s1=="1231234111", s2=="1234" -
функция вернет цифру 4.
Заранее спасибо за помощь.
Post #: 1
RE: strstr в языке СИ(не C++) - 2012-05-06 16:37:05.440000   
jdam

Сообщений: 199
Оценки: -20
Присоединился: 2012-03-11 01:34:16.840000
quote:

Объявление функции: char *strstr (char *s1, char *s2)


quote:

функция вернет цифру 4.


Почему она будет возвращать цифру 4, если должна - указатель на тип char?
Post #: 2
RE: strstr в языке СИ(не C++) - 2012-05-06 16:58:42.450000   
anon_x

Сообщений: 17
Оценки: 0
Присоединился: 2011-12-05 20:48:32.280000

quote:

ORIGINAL: jdam

quote:

Объявление функции: char *strstr (char *s1, char *s2)


quote:

функция вернет цифру 4.


Почему она будет возвращать цифру 4, если должна - указатель на тип char?


Она должна вернуть номер символа в строке…
Post #: 3
RE: strstr в языке СИ(не C++) - 2012-05-06 17:07:16.066666   
jdam

Сообщений: 199
Оценки: -20
Присоединился: 2012-03-11 01:34:16.840000
Значит объявление функции должно быть:

int strstr(char *s1, char *s2);
Post #: 4
RE: strstr в языке СИ(не C++) - 2012-05-06 17:24:00.630000   
anon_x

Сообщений: 17
Оценки: 0
Присоединился: 2011-12-05 20:48:32.280000

quote:

ORIGINAL: jdam

Значит объявление функции должно быть:

int strstr(char *s1, char *s2);


Я тоже так подумал… Но в методичке написано, что объявление именно char *strstr (char *s1, char *s2)… Возможно я что-то не так понял.
Post #: 5
RE: strstr в языке СИ(не C++) - 2012-05-06 17:37:34.783333   
anon_x

Сообщений: 17
Оценки: 0
Присоединился: 2011-12-05 20:48:32.280000
Значение функции - ссылка на первое вхождение s2 в s1 или NULL, если s2 нет в s1. Функция должна вернуть адрес символа в строке s1, с которого начинается подстрока s2. - так написано в методичке.
Post #: 6
RE: strstr в языке СИ(не C++) - 2012-05-06 17:42:33.253333   
jdam

Сообщений: 199
Оценки: -20
Присоединился: 2012-03-11 01:34:16.840000
Вот это верная формулировка. Адрес символа в строке s1 как раз таки и является указателем на тип char.
Post #: 7
RE: strstr в языке СИ(не C++) - 2012-05-06 17:45:36.336666   
anon_x

Сообщений: 17
Оценки: 0
Присоединился: 2011-12-05 20:48:32.280000

quote:

ORIGINAL: jdam

Вот это верная формулировка. Адрес символа в строке s1 как раз таки и является указателем на тип char.


Тогда извиняюсь, что изначально неверно сформулировал вопрос…
Post #: 8
RE: strstr в языке СИ(не C++) - 2012-05-06 18:05:35.743333   
anon_x

Сообщений: 17
Оценки: 0
Присоединился: 2011-12-05 20:48:32.280000
Реализовал так:

char *strstr (char *s1, char *s2)
{
int i=0, j=0;

while (s2!='\0')
{
if (s1[j]==s2)
j++, i++;
else
j++, i=0;
}
return NULL;
}

Результат тот же, что и от функции strstr в библиотеке string.h. Правильно или нет?
Post #: 9
RE: strstr в языке СИ(не C++) - 2012-05-06 18:21:34.943333   
jdam

Сообщений: 199
Оценки: -20
Присоединился: 2012-03-11 01:34:16.840000
Нет.
Где возврат результата в случае успешного завершения функции?
Неверное сравнение s1[j] == s2.
Константа NULL не определена.
Post #: 10
RE: strstr в языке СИ(не C++) - 2012-05-06 18:28:54.646666   
anon_x

Сообщений: 17
Оценки: 0
Присоединился: 2011-12-05 20:48:32.280000
1. Рядом с s2 в квадратных скобках стоит i, но она почему то не показана в сообщении, хотя при редактировании она есть.
2. А как нужно?
Post #: 11
RE: strstr в языке СИ(не C++) - 2012-05-06 18:32:02.100000   
anon_x

Сообщений: 17
Оценки: 0
Присоединился: 2011-12-05 20:48:32.280000
Исправил, заключив в теги:
char *strstr (char *s1, char *s2) { int i=0, j=0; if (s2[i]=='\0') return NULL; else { while (s2[i]!='\0') { if (s1[j]==s2[i]) j++, i++; else j++, i=0; } } return 0; }
Post #: 12
RE: strstr в языке СИ(не C++) - 2012-05-06 20:52:19.350000   
jdam

Сообщений: 199
Оценки: -20
Присоединился: 2012-03-11 01:34:16.840000
вот написал правильно работающий вариант:

#define NULL (void *)0 char *mstrstr(char *s1, char *s2); int main() { mstrstr("superzhopa","zhopa"); } char *mstrstr(char *s1, char *s2) { int i, j = 0; int inmatch = 0; char *first_symbol = NULL; int cur_symbol_s1 = 0; for (j; s2[j] != '\0'; j++) { for (i = cur_symbol_s1; s1[i] != '\0'; i++) { if (s1[i] == s2[j]) { if (inmatch == 0) { first_symbol = &s1[i]; inmatch = 1; } cur_symbol_s1 = i + 1; break; } if (inmatch == 1 && s1[i] != s2[j]) { inmatch = 0; first_symbol = NULL; j = 0; break; } } } return first_symbol; }
Post #: 13
RE: strstr в языке СИ(не C++) - 2012-05-06 21:27:35.236666   
anon_x

Сообщений: 17
Оценки: 0
Присоединился: 2011-12-05 20:48:32.280000
Спасибо за помощь. Программа должна возвращать строку от начала строки s2 и до конца? У меня то же самое делала…)))
Зачем #define NULL (void *) 0, ведь компилятор ругается на несоответствие типов.
first_symbol = &s1[i]; нельзя присвоить char* к char**
Post #: 14
RE: strstr в языке СИ(не C++) - 2012-05-06 22:57:59.363333   
jdam

Сообщений: 199
Оценки: -20
Присоединился: 2012-03-11 01:34:16.840000
quote:

Программа должна возвращать строку от начала строки s2 и до конца?

Функция mstrstr возвращает указатель на первый символ первого вхождения строки s2 в строку s1. Если ты используешь этот указатель для вывода строки на печать, например с помощью функции printf, то тогда, действительно, выведется то, что ты сказал

quote:

Зачем #define NULL (void *) 0, ведь компилятор ругается на несоответствие типов.

Лично у меня не ругается, и потом если посмотреть стандартные заголовочные файлы, то константа NULL в C именно так определяется. Ну если у тебя ругается, то тогда не пиши так, попробуй напиши #define NULL 0

quote:

first_symbol = &s1[i];
нельзя присвоить char* к char**

Не понял. Здесь и слева и справа char *
Post #: 15
RE: strstr в языке СИ(не C++) - 2012-05-06 23:22:50.703333   
anon_x

Сообщений: 17
Оценки: 0
Присоединился: 2011-12-05 20:48:32.280000
quote:

ORIGINAL: jdam

quote:

Программа должна возвращать строку от начала строки s2 и до конца?

Функция mstrstr возвращает указатель на первый символ первого вхождения строки s2 в строку s1

У меня функция возвращает почему-то строку от начала s2 и до конца.

quote:


quote:

first_symbol = &s1[i];
нельзя присвоить char* к char**

Не понял. Здесь и слева и справа char *

Первая звездочка для s1 в объявлении… Вторая - &.
Post #: 16
RE: strstr в языке СИ(не C++) - 2012-05-06 23:28:40.440000   
jdam

Сообщений: 199
Оценки: -20
Присоединился: 2012-03-11 01:34:16.840000
Про то почему выводится строка до конца, читай мой предыдущий отредактированный пост


quote:

Первая звездочка для s1 в объявлении… Вторая - &.

Всё правильно. & нужен потому, что s1[i] - это уже не указатель.
Post #: 17
RE: strstr в языке СИ(не C++) - 2012-05-06 23:39:48.733333   
anon_x

Сообщений: 17
Оценки: 0
Присоединился: 2011-12-05 20:48:32.280000
quote:

ORIGINAL: jdam

Про то почему выводится строка до конца, читай мой предыдущий отредактированный пост


quote:

Первая звездочка для s1 в объявлении… Вторая - &.

Всё правильно. & нужен потому, что s1[i] - это уже не указатель.


Извиняюсь. Я в объявлении просто немного намутил. Вместо *s1 написал *s1[].

А вот если я пишу функцию отдельно от printf, то у меня вообще ничего не выводиться… Почему так?
Post #: 18
RE: strstr в языке СИ(не C++) - 2012-05-06 23:53:49.190000   
anon_x

Сообщений: 17
Оценки: 0
Присоединился: 2011-12-05 20:48:32.280000
Вообщем весь код:
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;iostream&gt; #define DLSTR 255 /*--------------------------------*/ /*--------Подпрограмма------------*/ /*--------------------------------*/ char *strstr (char *s1, char *s2) { int i, j = 0; int inmatch = 0; char *first_symbol = NULL; int cur_symbol_s1 = 0; for (j; s2[j]!='\0'; j++) { for (i = cur_symbol_s1; s1[i]!='\0'; i++) { if (s1[i] == s2[j]) { if (inmatch == 0) { first_symbol = &s1[i]; inmatch = 1; } cur_symbol_s1 = i + 1; break; } if (inmatch == 1 && s1[i] != s2[j]) { inmatch = 0; first_symbol = NULL; j = 0; break; } } } return first_symbol; } /*--------------------------------*/ /*-----Главная функция------------*/ /*--------------------------------*/ void main () { setlocale (LC_ALL, "Russian_Russia.1251"); char s1[DLSTR], //Строка 1 s2[DLSTR]; //Строка 2 printf ("Введите 1-ю строку:\n"); gets(s1); printf ("Введите 2-ю строку:\n"); gets(s2); printf ("Первое вхождение строки 2 в строку 1: "); strstr(s1, s2); printf ("\nPress any key..."); getch (); }
Post #: 19
RE: strstr в языке СИ(не C++) - 2012-05-06 23:54:06.993333   
jdam

Сообщений: 199
Оценки: -20
Присоединился: 2012-03-11 01:34:16.840000
Сама функция mstrstr и не должна ничего выводить, она только передает значение, вызвавшей её функции
Post #: 20
RE: strstr в языке СИ(не C++) - 2012-05-06 23:58:27.570000   
anon_x

Сообщений: 17
Оценки: 0
Присоединился: 2011-12-05 20:48:32.280000
И как в итоге реализовать?
Post #: 21
RE: strstr в языке СИ(не C++) - 2012-05-07 00:05:20.113333   
jdam

Сообщений: 199
Оценки: -20
Присоединился: 2012-03-11 01:34:16.840000
У тебя всё правильно реализовано.
Post #: 22
RE: strstr в языке СИ(не C++) - 2012-05-07 00:07:36.350000   
anon_x

Сообщений: 17
Оценки: 0
Присоединился: 2011-12-05 20:48:32.280000
Но ничего не выводится… Только то, что в printf, а сама функция нет.
Post #: 23
RE: strstr в языке СИ(не C++) - 2012-05-07 00:36:48.883333   
jdam

Сообщений: 199
Оценки: -20
Присоединился: 2012-03-11 01:34:16.840000
Во-первых, я тут внёс некоторые исправления в саму функцию mstrstr, т. к. она некорректно работала в некоторых случаях.

char *mstrstr(char *s1, char *s2) { int i, j = 0; int inmatch = 0; char *first_symbol = NULL; int cur_symbol_s1 = 0; for (j; s2[j] != '\0'; j++) { if (s1[cur_symbol_s1] == '\0') { first_symbol = NULL; break; } for (i = cur_symbol_s1; s1[i] != '\0'; i++) { if (s1[i] == s2[j]) { if (inmatch == 0) { first_symbol = &s1[i]; inmatch = 1; } cur_symbol_s1 = i + 1; break; } if (inmatch == 1 && s1[i] != s2[j]) { inmatch = 0; first_symbol = NULL; j = 0; break; } } } return first_symbol; }

Во-вторых, ты сам хочешь вывод какого вида чтобы был?
Post #: 24
RE: strstr в языке СИ(не C++) - 2012-05-07 00:42:35.906666   
anon_x

Сообщений: 17
Оценки: 0
Присоединился: 2011-12-05 20:48:32.280000
Вывод в виде "Первое вхождение строки 2 в строку 1: [результат подпрограммы]".
Post #: 25
RE: strstr в языке СИ(не C++) - 2012-05-07 03:30:21.310000   
jdam

Сообщений: 199
Оценки: -20
Присоединился: 2012-03-11 01:34:16.840000
printf("Первое вхождение строки 2 в строку 1: %d символ\n", strstr(s1, s2) - s1 + 1); тебя устроит?
Post #: 26
RE: strstr в языке СИ(не C++) - 2012-05-07 14:39:38.106666   
anon_x

Сообщений: 17
Оценки: 0
Присоединился: 2011-12-05 20:48:32.280000
Объясни пожалуйста, почему strstr (s1, s2) - s1 + 1
И если ввести пустую строку, то не выводит NULL..
Post #: 27
RE: strstr в языке СИ(не C++) - 2012-05-07 16:08:24.963333   
jdam

Сообщений: 199
Оценки: -20
Присоединился: 2012-03-11 01:34:16.840000
strstr (s1, s2) - указывает на адрес памяти, где начинается вхождение
s1 - указывает на адрес памяти, где начинается строка s1
Если найти разницу между ними, то получим порядковый номер символа(если отсчет начинать с нуля), с которого начинается вхождение.

quote:

И если ввести пустую строку, то не выводит NULL..

а что выводит?
Post #: 28
RE: strstr в языке СИ(не C++) - 2012-05-07 17:49:40.973333   
anon_x

Сообщений: 17
Оценки: 0
Присоединился: 2011-12-05 20:48:32.280000
Выводит отрицательное число. Обычно шестизначное. Решил через if:
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;iostream&gt; #define DLSTR 255 /*--------------------------------*/ /*--------Подпрограмма------------*/ /*--------------------------------*/ char *strstr (char *s1, char *s2) { int i, j = 0; int inmatch = 0; char *first_symbol = NULL; int cur_symbol_s1 = 0; for (j; s2[j]!='\0'; j++) { if (s1[cur_symbol_s1] =='\0') { first_symbol = NULL; break; } for (i = cur_symbol_s1; s1[i]!='\0'; i++) { if (s1[i] == s2[j]) { if (inmatch == 0) { first_symbol = &s1[i]; inmatch = 1; } cur_symbol_s1 = i + 1; break; } if (inmatch == 1 && s1[i] != s2[j]) { inmatch = 0; first_symbol = NULL; j = 0; break; } } } return first_symbol; } /*--------------------------------*/ /*-----Главная функция------------*/ /*--------------------------------*/ void main () { setlocale (LC_ALL, "Russian_Russia.1251"); char s1[DLSTR], //Строка 1 s2[DLSTR]; //Строка 2 printf ("Введите 1-ю строку:\n"); gets(s1); printf ("Введите 2-ю строку:\n"); gets(s2); if ((strstr (s1, s2) - s1 + 1)&lt;=0) printf("Первое вхождение строки 2 в строку 1: %s", NULL); else { printf ("Первое вхождение строки 2 в строку 1: %d символ.", strstr(s1, s2) - s1 +1); } printf ("\nPress any key..."); getch (); } Теперь все работает. Спасибо огромное за помощь…:)
Post #: 29
Страниц:  [1]
Все форумы >> [Первый вопрос] >> strstr в языке СИ(не C++)







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.