strstr в языке СИ(не C++)
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
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. Заранее спасибо за помощь.
|
|
|
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?
|
|
|
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? Она должна вернуть номер символа в строке…
|
|
|
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);
|
|
|
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)… Возможно я что-то не так понял.
|
|
|
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. - так написано в методичке.
|
|
|
RE: strstr в языке СИ(не C++) - 2012-05-06 17:42:33.253333
|
|
|
jdam
Сообщений: 199
Оценки: -20
Присоединился: 2012-03-11 01:34:16.840000
|
Вот это верная формулировка. Адрес символа в строке s1 как раз таки и является указателем на тип char.
|
|
|
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. Тогда извиняюсь, что изначально неверно сформулировал вопрос…
|
|
|
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. Правильно или нет?
|
|
|
RE: strstr в языке СИ(не C++) - 2012-05-06 18:21:34.943333
|
|
|
jdam
Сообщений: 199
Оценки: -20
Присоединился: 2012-03-11 01:34:16.840000
|
Нет. Где возврат результата в случае успешного завершения функции? Неверное сравнение s1[j] == s2. Константа NULL не определена.
|
|
|
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. А как нужно?
|
|
|
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;
}
|
|
|
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;
}
|
|
|
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**
|
|
|
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 *
|
|
|
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 в объявлении… Вторая - &.
|
|
|
RE: strstr в языке СИ(не C++) - 2012-05-06 23:28:40.440000
|
|
|
jdam
Сообщений: 199
Оценки: -20
Присоединился: 2012-03-11 01:34:16.840000
|
Про то почему выводится строка до конца, читай мой предыдущий отредактированный пост quote:
Первая звездочка для s1 в объявлении… Вторая - &. Всё правильно. & нужен потому, что s1[i] - это уже не указатель.
|
|
|
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, то у меня вообще ничего не выводиться… Почему так?
|
|
|
RE: strstr в языке СИ(не C++) - 2012-05-06 23:53:49.190000
|
|
|
anon_x
Сообщений: 17
Оценки: 0
Присоединился: 2011-12-05 20:48:32.280000
|
Вообщем весь код:
#include <stdio.h>
#include <conio.h>
#include <iostream>
#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 ();
}
|
|
|
RE: strstr в языке СИ(не C++) - 2012-05-06 23:54:06.993333
|
|
|
jdam
Сообщений: 199
Оценки: -20
Присоединился: 2012-03-11 01:34:16.840000
|
Сама функция mstrstr и не должна ничего выводить, она только передает значение, вызвавшей её функции
|
|
|
RE: strstr в языке СИ(не C++) - 2012-05-06 23:58:27.570000
|
|
|
anon_x
Сообщений: 17
Оценки: 0
Присоединился: 2011-12-05 20:48:32.280000
|
И как в итоге реализовать?
|
|
|
RE: strstr в языке СИ(не C++) - 2012-05-07 00:05:20.113333
|
|
|
jdam
Сообщений: 199
Оценки: -20
Присоединился: 2012-03-11 01:34:16.840000
|
У тебя всё правильно реализовано.
|
|
|
RE: strstr в языке СИ(не C++) - 2012-05-07 00:07:36.350000
|
|
|
anon_x
Сообщений: 17
Оценки: 0
Присоединился: 2011-12-05 20:48:32.280000
|
Но ничего не выводится… Только то, что в printf, а сама функция нет.
|
|
|
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;
} Во-вторых, ты сам хочешь вывод какого вида чтобы был?
|
|
|
RE: strstr в языке СИ(не C++) - 2012-05-07 00:42:35.906666
|
|
|
anon_x
Сообщений: 17
Оценки: 0
Присоединился: 2011-12-05 20:48:32.280000
|
Вывод в виде "Первое вхождение строки 2 в строку 1: [результат подпрограммы]".
|
|
|
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); тебя устроит?
|
|
|
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..
|
|
|
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.. а что выводит?
|
|
|
RE: strstr в языке СИ(не C++) - 2012-05-07 17:49:40.973333
|
|
|
anon_x
Сообщений: 17
Оценки: 0
Присоединился: 2011-12-05 20:48:32.280000
|
Выводит отрицательное число. Обычно шестизначное. Решил через if:
#include <stdio.h>
#include <conio.h>
#include <iostream>
#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)<=0)
printf("Первое вхождение строки 2 в строку 1: %s", NULL);
else
{
printf ("Первое вхождение строки 2 в строку 1: %d символ.", strstr(s1, s2) - s1 +1);
}
printf ("\nPress any key...");
getch ();
}
Теперь все работает. Спасибо огромное за помощь…:)
|
|
|
|
|