Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
#1

Возвращение функциями указателей - C++

11.09.2009, 22:30. Просмотров 1811. Ответов 21
Метки нет (Все метки)

Читаю про указатели, тут для примера,предоставляется код. Программа ищет какую-то подстроку в строке. Кто нибудь может объяснить,каким образом ищется подстрока из этого кода,если не сложно. Заранее благодарю.


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
#include <iostream>
using namespace std;
 
char *get_substr(char *sub, char * str);  //char *get_substr возвращает указатель на char,что Это даёт?
 
int main()
{
    setlocale(0,"");
    char *substr = get_substr("три","один два три четыре");
    cout<<"Заданная подстркоа найдена: "<<substr;
    cin.get();
 
}
 
char *get_substr(char *sub, char * str)
{
    int t;
    char *p, *p2, *start;
 
    for(t = 0; str[t]; t++)
    {
        p = &str[t];
        start = p;
        p2 = sub;
        while(*p2 && *p2 == *p)  //Это неизвестно что делается
        {
            p++;
            p2++;
        }
if(!*p2)         //Это неизвестно что такое
return start;
 
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2009, 22:30     Возвращение функциями указателей
Посмотрите здесь:

Возвращение функциями указателей - C++
Доброго времени суток:) Помогите понять код!!!Суть вопроса описана в коментах в коде. Условие задачи:В программе демонстрируеться...

Возвращение из функции массива указателей - C++
Здравствуйте. Мне нужно вернуть из функции массив указателей. Внутри функции создаю динамический массив указателей, в который помещаю...

Возвращение значения - C++
Понятно, когда функция возвращает число или тип bool, вот так: return true; return 0; return -1; и т.п. но что может означать...

возвращение подмассив - C++
Нужно написать функцию которая будет принимать два параматры: массив и количество элементов каторих нужно вернуть в новом масиве. Написать...

Возвращение char[] - C++
Привет, всем. Столкнулся с небольшой проблемой: нужно вывести на экран массив char, а выводится только 0-ой элемент...т.е. передается...

Возвращение по ссылке - C++
Здравствуйте! Суть проблемы следующая. Необходимо, чтобы методы класса Pstring2 возвращали значения по ссылке, с возможностью размещения...

возвращение ненулевого значения - C++
Подскажите если функция возвращает ненулевое значение оно каждый раз меняется или как. Вот например #include &lt;iostream.h&gt; #include...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TGrey[WoLf]
39 / 39 / 1
Регистрация: 14.09.2008
Сообщений: 685
11.09.2009, 23:25     Возвращение функциями указателей #2
Это где такой пример есть?
В общем
Код
while(*p2 == *p)  //Это неизвестно что делается
* разыменовывает указатель тем самым ты получаешь не адрес на который он указывает, а значение которое хранится там. То есть этот цикл будет работать пока значения совпадают.
Внутри адрес увеличивается на 1 и проверяется снова.
Код
if(!*p2)         //Это неизвестно что такое
Это вроде проверяется конец искомой строки. Проверка на то есть ли там что-то.

Да и код кривой возвращает не подстроку, а все начиная с той строки.
M128K145
Эксперт С++
8284 / 3503 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
11.09.2009, 23:51     Возвращение функциями указателей #3
Цитата Сообщение от Golovastik Посмотреть сообщение
char *get_substr возвращает указатель на char,что Это даёт?
Это дает то, что ты можеш читать всю строку начиная с некоего адреса(индекса) в этой строке а который указывает этот указатель.
Цитата Сообщение от Golovastik Посмотреть сообщение
C++
1
2
3
4
5
while(*p2 && *p2 == *p) //Это неизвестно что делается
 {
 p++;
 p2++;
 }
Пока существует твоя подстрока которую ты ищеш("три") и пока элемент из подстроки(sub) равен элементу строки(str) то смещаться по одной и второй строке на один символ вправо и проделывать ту же проверку пока условие истинно.

Добавлено через 25 минут
Код вообще кривой. Начиная с 30 строки там творится что-попало. Автор как-то непродуманно написал программку. Я б
так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
char *get_substr(char *sub, char * str)
{
    if(!*sub)
        return "строка поиска пустая";
 
    int t;
    size_t sz = strlen(sub);
    char *p, *p2;
 
    for(t = 0; str[t]; t++)
    {
        p = &str[t];
        p2 = sub;
        while(*p2 && *p2 == *p)
            p++,p2++;
        if(!*p2)
            return p - sz;
    }
    return "не найден";
}
её переписал бы
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,911
11.09.2009, 23:52     Возвращение функциями указателей #4
Думаю так будет понятней
C++
1
 while(*p2 && (*p2 == *p))
------------------------------------------
C++
1
if(!*p2) return start;
Это значит, что цикл while выполнился до конца и все символы совпали.

P.S. Если не секрет, что за книгу читаешь? Там исходник выглядит так же, как ты его выложил здесь?
easybudda
Эксперт С++
9460 / 5473 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
12.09.2009, 00:39     Возвращение функциями указателей #5
На самом деле это какая-то нелепая реализация библиотечной функции strstr.

Короче, вот Вам на С с указателями, переделайте на С++ при желании...
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
38
39
#include <stdio.h>
 
/* клон библиотечной функции char *strstr(const char *, const char *) */
 
char *strstr(const char *haystack, const char *needle);
 
int main(){
    char *haystack = "one two three";
    char *needle = "two";
    char *badneedle = "four";
    char *found;
    
    if ( (found = strstr(haystack, needle)) != NULL )
        printf("\"%s\" is in string \"%s\"\n", found, haystack);
    else
        printf("string \"%s\" don't contain \"%s\"\n", haystack, needle);
        
    if ( (found = strstr(haystack, badneedle)) != NULL )
        printf("\"%s\" is in string \"%s\"\n", found, haystack);
    else
        printf("string \"%s\" don't contain \"%s\"\n", haystack, badneedle);    
    
    return(0);
}
 
char *strstr(const char *haystack, const char *needle){
    char *h;
    char *n;
    char *p;
    
    for ( h = (char *)haystack; *h; h++ ) {
        p = h;
        n = (char *)needle;
        while ( *p++ == *n++ )
            if ( *n == 0 ) 
                return(h);  
    }
    return(NULL);
}
Добавлено через 18 минут
как-то не сразу дошло... на самом деле там примерно то же самое...

Цитата Сообщение от Golovastik Посмотреть сообщение
while(*p2 && *p2 == *p) //Это неизвестно что делается
это проверка того, что строка sub ещё не закончилась и очередной символ в ней равен символу из строки, в которой sub ищется... Вот у меня эта же проверка:
Цитата Сообщение от easybudda Посмотреть сообщение
while ( *p++ == *n++ )
Цитата Сообщение от Golovastik Посмотреть сообщение
if(!*p2) //Это неизвестно что такое
return start;
это если все символы из sub нашлись в str и sub закончилась (после очередного приращения *p2 == '\0'), вернуть start...
Действительно чуднАя реализация... Что хоть за книжка-то?
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,911
12.09.2009, 00:50     Возвращение функциями указателей #6
Цитата Сообщение от M128K145 Посмотреть сообщение
Я б так её переписал бы
И в чём плюсы такого подхода?
easybudda
Эксперт С++
9460 / 5473 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
12.09.2009, 01:02     Возвращение функциями указателей #7
Цитата Сообщение от M128K145 Посмотреть сообщение
if(!*sub)
return "строка поиска пустая";
а я-то голову ломаю - забыл, думаю, что-то...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
char *strstr(const char *haystack, const char *needle){
        char *h;
        char *n;
        char *p;
 
        if ( *needle == '\0' )
                return(NULL);
        
        for ( h = (char *)haystack; *h; h++ ) {
                p = h;
                n = (char *)needle;
                while ( *p++ == *n++ )
                        if ( *n == 0 ) 
                                return(h);      
        }
        return(NULL);
}
M128K145
Эксперт С++
8284 / 3503 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
12.09.2009, 01:03     Возвращение функциями указателей #8
rangerx, хотя бы в том, что не выделяется память под лишние указатели, не производятся ненужные операции и выдается вполне адекватный ответ о результатах работы функции. Да, ты можеш сказать, что там пара указателей и пара операций чтения/записи, но ты представь, что это запрос на какой-нибудь поисковый сервер и какие задержки по времени на ожидание ответа от сервера, если это можно обработать и прервать еще перед отправкой запроса. Надо изначально писать правильно, а не в расчете что там пара операций
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,911
12.09.2009, 02:23     Возвращение функциями указателей #9
не производятся ненужные операции
Невнимательно посмотрел код. Да, так по идее должно быть быстрее...
Да, ты можеш сказать, что там пара указателей и пара операций чтения/записи, но ты представь, что это запрос на какой-нибудь поисковый сервер
На самом деле ни один толковый программист не станет использовать данный алгоритм поиска для задач, где требуется действительно высокая производительность.
Надо изначально писать правильно, а не в расчете что там пара операций
Никто не спорит ) Но, если уж гнаться за производительностью, то зачем использовать постфиксную версию ++ там, где можно использовать префиксную?
M128K145
Эксперт С++
8284 / 3503 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
12.09.2009, 07:55     Возвращение функциями указателей #10
rangerx, я говорил в общем про конкретную мысль, а не алгоритм А постфикс - это копипаст
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
14.09.2009, 22:59  [ТС]     Возвращение функциями указателей #11
Данный код, который был выше,находил слово, и от него выводилась вся строка.
Не подскажите,как найти чисто одно слово из текста? Не знаю как это реализовать программой используя указатели.
M128K145
Эксперт С++
8284 / 3503 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
14.09.2009, 23:38     Возвращение функциями указателей #12
Golovastik, что понимаеш под "найти слово". В смысле его индекс или что? Вот чисто возврат
подстроки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
char *get_substr(char *sub, char * str)
{
    if(!*sub)
        return "строка поиска пустая";
 
    int t;
    size_t sz = strlen(sub);
    char *p, *p2, *rez;
 
    for(t = 0; str[t]; t++)
    {
        p = &str[t];
        p2 = sub;
        while(*p2 && *p2 == *p)
        {
            rez = p2;
            p++,p2++, rez++;
        }
        if(!*p2)
            return rez-sz;
    }
    return "не найден";
}
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
14.09.2009, 23:51  [ТС]     Возвращение функциями указателей #13
Вроде так, не расскажите немножко по циклу, как он работает, и ещё перед ним про строку:
C++
1
 size_t sz = strlen(sub);
Самое главное про этот кусок:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
 for(t = 0; str[t]; t++)
        {
                p = &str[t];
                p2 = sub;
                while(*p2 && *p2 == *p)
                {
                        rez = p2;
                        p++, p2++, rez++; //Почему через запятую, а не точка с запятой?
                }
                if(!*p2) 
                        return rez-sz; //Что это?
        }
        return "не найден"; // разве такое можно делать, и как это называется?
Ещё очень волнует вопрос про вот это:
C++
1
char *get_substr(char *sub, char * str)
Что даёт char * в данной функции,как от неё толк в функции?
M128K145
Эксперт С++
8284 / 3503 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
15.09.2009, 00:02     Возвращение функциями указателей #14
или вот то же самое, но с
индексом
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
int get_substr(char *sub, char * str)
{
    if(!*sub)
        return -2;// "строка поиска пустая";
 
    int t;
    size_t sz = strlen(sub);
    char *p, *p2, *rez;
 
    for(t = 0; str[t]; t++)
    {
        p = &str[t];
        p2 = sub;
        while(*p2 && *p2 == *p)
        {
            rez = p2;
            p++,p2++, rez++;
        }
        if(!*p2)
            return t;
    }
    return -1; //"не найден";
}
 
int main()
{
    setlocale(0,"");
    cout<<"Заданная подстркоа найдена: "<<get_substr("три","один два три четыре");
    cin.get();
}


C++
1
2
size_t sz = strlen(sub);// получение длины строки sub.
// size_t - это версия unsigned int для размеров
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for(t = 0; str[t]; t++)
        {
                p = &str[t];
                p2 = sub;
                while(*p2 && *p2 == *p)
                {
                        rez = p2;
                        p++, p2++, rez++; // запятая - операция псевдопараллельности. можно и через запятую ;)
                }
                if(!*p2) 
                        return rez-sz; // возврат указателя на начало найденной подстроки.
                        // В rez - указатель на конец подстроки, если отнять длину,
                        // то получим как раз указатель на начало
        }
        return "не найден"; // это возврат строки по указателю
        //равносильно char* hh = "не найден"; return hh;
Добавлено через 9 минут
Цитата Сообщение от Golovastik Посмотреть сообщение
Что даёт char * в данной функции,как от неё толк?
в параметрах или нет? Если в параметрах, то передача по указателю, если нет, то показывает данные какого типа возвращает функция
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
15.09.2009, 00:10  [ТС]     Возвращение функциями указателей #15
Спасибо за ответ выше. Эта строка:
C++
1
char *get_substr(char *sub, char * str)
Уже прочитал эту тему в книге, но до исх пор не могу понять, что даёт возвращение функции на указатель char char *get_substr,что оно даёт вообще, зачем прописывать так:
C++
1
char *get_substr(char *sub, char * str)
а не так:
C++
1
char  get_substr(char *sub, char * str)
Благодарю за ответ.
M128K145
Эксперт С++
8284 / 3503 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
15.09.2009, 00:15     Возвращение функциями указателей #16
потому что char - это один символ, а char* - массив символов
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
15.09.2009, 00:50     Возвращение функциями указателей #17
M128K145,
потому что char - это один символ, а char* - массив символов
а теперь - правильный ответ (:
потому что char - это один символ, а char* - это указатель на один символ (что, впрочем, не мешает запихать туда много симаолов)
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
15.09.2009, 00:54  [ТС]     Возвращение функциями указателей #18
C++
1
char* - это указатель на один символ
На что именно тогда указывает функция *get_substr,
как знать? Что будет,если не прописать знак звёздочки в этой программе,тоесть написать:
C++
1
char  get_substr(char *sub, char * str)
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
15.09.2009, 01:00     Возвращение функциями указателей #19
Цитата Сообщение от Golovastik Посмотреть сообщение
Что будет,если не прописать знак звёздочки в этой программе,тоесть написать:
Да тупо не скомпилируется, будет ошибка некорректного преобразования char* в char. *start же указатель, а не символ.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2009, 01:01     Возвращение функциями указателей
Еще ссылки по теме:

Возвращение обьекта из шаблона - C++
Всем доброго дня ! Не могу понять в чем проблема ((( Есть класс шаблон А template &lt;class T&gt; class A

Возвращение ссылок с const - C++
Объясните, пожалуйста, зачем делать возвращаемое значение из функции ссылкой с const, я понимаю, например, при передаче в функцию const &amp;,...

Про возвращение значения... - C++
Как написать ф-цию,возвращающую значение 1,если в строке содержится хотя бы один символ &quot;.&quot; ?

Возвращение значения функции - C++
Я создала структуру и конструктор. Нужно создать функцию типа этой структуры add_one_minute, которая будет прибавлять одну минуту. Но я не...

Возвращение значений из функции - C++
как вернуть кроме значения структуры еще и значение переменной а типа int? struct STROKA { string name; int kolvo,ves; }; ...


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

Или воспользуйтесь поиском по форуму:
Mecid
680 / 229 / 4
Регистрация: 15.10.2007
Сообщений: 1,247
15.09.2009, 01:01     Возвращение функциями указателей #20
если без звезды то это значит,вернется один символ,а со звездой возвращается указатель на символ
Yandex
Объявления
15.09.2009, 01:01     Возвращение функциями указателей
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru