Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.10.2018, 14:40   #1
Sinli
Пользователь
 
Регистрация: 10.09.2018
Сообщений: 43
По умолчанию Помогите разобраться с указателями на символьные строки.

Добрый день. Есть такое задание:
Скриншот 2018-10-10 14_21_10.png
Вот мой код:
Код:
#include <stdio.h>
#include <string.h>
char * charfind (char *st, char cr);
int main (void)
{
        char string[81] = "bombom h bombom";
        char ch = 'h';
        char *x, *y;
        x = charfind(string, ch);
        y = strchr(string, 'b');
        if (x && y)
        {
                printf("%p и %p\n", x, y);
                printf("%c и %c\n", *x, *y);
                *x = 'g';
                *y = 'k';
                printf("%s\n", string);
        }
        return 0;
}
char * charfind (char *st, char cr)
{
        char * needtofind = NULL;
        int i = 0;
        while (st[i] != cr)
                i++;
        needtofind = st[i];
        return needtofind;
}
Вот такое предупреждение выдает компилятор. Я не понимаю, что оно означает.
Скриншот 2018-10-10 14_23_55.png
И вот такой получается вывод:
Скриншот 2018-10-10 14_24_32.png

Помогите, пожалуйста с, поиском и устранением ошибки. Из того, что я вижу: стандартная функция strchr() работает, так как "char *y" получает адрес символа. Очевидно, проблема в моей самодельной функции charfind - *x получает какое-то странное 0х68, ну и компилятор как бы намекает. Тогда я не могу понять, почему нельзя присвоить needtofind адрес st[i]. Разве я тут что-то нарушаю?

Заранее спасибо.
Sinli вне форума Ответить с цитированием
Старый 10.10.2018, 14:48   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Сообщение от Sinli Посмотреть сообщение
Я не понимаю, что оно означает.
Что вы указателю присваиваете символ.

Цитата:
Сообщение от Sinli Посмотреть сообщение
И вот такой получается вывод:
Ну так видно же, что вместо указателя код символа. Естественно на разыменовании падает.

Цитата:
Сообщение от Sinli Посмотреть сообщение
Тогда я не могу понять, почему нельзя присвоить needtofind адрес st[i]. Разве я тут что-то нарушаю?
Можно. Но вы ведь не адрес присваиваете... в том и проблема.

П.С. И поиск надо делать до конца строки, а не пока куда-нибудь не попадем.
П.С.С. Если строку объявили в коде, то не стоит ее пытаться менять.
p51x вне форума Ответить с цитированием
Старый 10.10.2018, 15:00   #3
Sinli
Пользователь
 
Регистрация: 10.09.2018
Сообщений: 43
По умолчанию

Понял!!
Сделал вот так:
Код:
needtofind = &st[i];
В итоге компилятор не ругался. Вывод получился такой, как я и хотел:
Скриншот 2018-10-10 14_54_53.png
Только вопрос, зачем делать поиск до конца строки, если нам нужно найти всего лишь первое вхождение символа?
Sinli вне форума Ответить с цитированием
Старый 10.10.2018, 15:06   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

А если символа не будет, когда и где остановитесь?
p51x вне форума Ответить с цитированием
Старый 10.10.2018, 15:58   #5
Sinli
Пользователь
 
Регистрация: 10.09.2018
Сообщений: 43
По умолчанию

И правда, цикл, выходит, не прервется. переделал:
Код:
char * charfind (char *st, char cr)
{
        char * needtofind;
        int i = 0;
        while (st[i] != cr && st[i] != '\0')
                i++;
        if (st[i] == '\0')
                needtofind = NULL;
        else
                needtofind = &st[i];
        return needtofind;
}
забавно, что сначала я сделал так:
Код:
char * charfind (char *st, char cr)
{
        char * needtofind = NULL;
        int i = 0;
        while (st[i] != cr && st[i] != '\0')
                i++;
        needtofind = &st[i];
        return needtofind;
}
И думал, что если, у needtofind будет адрес '\0', то функция вернет значение NULL, и программа завершится. Однако вместо этого программа вошла в if и заменила символ конца строки на символ *x. И получилось:

0x7ffff6286c3f и 0x7ffff6286c30
и b
kombom h bombomg

Спасибо большое за помощь!
Sinli вне форума Ответить с цитированием
Старый 10.10.2018, 16:01   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

А теперь передайте пустую строку...
p51x вне форума Ответить с цитированием
Старый 10.10.2018, 16:15   #7
Sinli
Пользователь
 
Регистрация: 10.09.2018
Сообщений: 43
По умолчанию

Эм...
Объявлял
так
Код:
char string[81] = "\n";
так
Код:
char string[81] = "";
и так
Код:
char string[81];
Программа просто завершается, как и должна.
Или, может быть, я не так вас понял?
Sinli вне форума Ответить с цитированием
Старый 10.10.2018, 16:22   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Ну это не совсем то... Объявите
Код:
char* string = '\0';
или вызовите свою функцию с nullptr/NULL.
p51x вне форума Ответить с цитированием
Старый 10.10.2018, 16:37   #9
Sinli
Пользователь
 
Регистрация: 10.09.2018
Сообщений: 43
По умолчанию

Код:
char string[81] = "\0";
это компилятор мне не позволил сделать.
Код:
x = charfind(NULL, ch);
это он скомпилировал.
Выполнение программы повлекло:
Segmentation fault (core dumped)
Sinli вне форума Ответить с цитированием
Старый 10.10.2018, 16:41   #10
Sinli
Пользователь
 
Регистрация: 10.09.2018
Сообщений: 43
По умолчанию

Переписал вот так, программа стала нормально завершаться, если передается нулевой указатель:

Код:
char * charfind (char *st, char cr)
{
        char * needtofind;
        int i = 0;
        if (st != NULL)
        {
        while (st[i] != cr && st[i] != '\0')
                i++;
        if (st[i] == '\0')
                needtofind = NULL;
        else
                needtofind = &st[i];
        }
        else
                needtofind = NULL;
        return needtofind;
}
Sinli вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобраться с указателями. Sinli Общие вопросы C/C++ 2 04.10.2018 22:47
Помогите пожалуйста разобраться с указателями? седьмой Общие вопросы C/C++ 20 18.04.2017 07:26
помогите разобраться с указателями С++ sasha_14-88 Общие вопросы C/C++ 1 07.12.2014 10:39
Помогите разобраться с указателями igole Общие вопросы C/C++ 1 28.04.2013 16:47
Товарищи, помогите разобраться с указателями scibern Общие вопросы C/C++ 7 11.01.2009 12:28