Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 07.01.2019, 19:19   #1
Kuznechik
Новичок
 
Регистрация: 07.01.2019
Сообщений: 3
Репутация: 10
По умолчанию

Код:

#include <stdio.h>

int obscure(char* s1, char* s2) {
    char* s1end = s1;
    while (*s1end) {
    ++s1end;
    }
    if (s2 >= s1 && s2 < s1end) {
        return s2 - s1;
    } return -1;
}


int main() {
    char hi1[] = "Hello!";
    char hi2[] = "Hello!";
    char* hi3 = hi1;
    char* hi4 = hi1 + 2;


    printf("%d\n", obscure(hi1, hi2));
    printf("%d\n", obscure(hi1, hi3));
    printf("%d\n", obscure(hi1, hi4));
    printf("%d\n", obscure(hi4, hi1));
}

Ответ:
-1 (cовсем не понимаю почему..)
0 (примерно понимаю..здесь s1, s2 имеют одинаковые адреса, s1end считает буквы в s1?? )
2 (примерно понимаю..)
-1 (примерно понимаю..)

Пожалуйста помогите разобраться . Такая сложная тема

Последний раз редактировалось Alex11223; 07.01.2019 в 19:30.
Kuznechik вне форума   Ответить с цитированием
Старый 07.01.2019, 19:22   #2
Alex11223
Модератор
Заслуженный модератор
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 17,935
Репутация: 3428

icq: 512-765
skype: alexp.frl
По умолчанию

Так запустите в отладчике и смотрите построчно.

И форматируйте код нормально (отступы).
Alex11223 на форуме   Ответить с цитированием
Старый 07.01.2019, 19:24   #3
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 13,620
Репутация: 2400
По умолчанию

Цитата:
Сообщение от Kuznechik Посмотреть сообщение
-1 (cовсем не понимаю почему..)
На что будет указывать s1end, когда остановится цикл
Код:

while (*s1end)

?
Может ли он "зелезть" на s2? Т.е. выполнится ли условие
Код:

s2 < s1end

?
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x на форуме   Ответить с цитированием
Старый 07.01.2019, 19:32   #4
Kuznechik
Новичок
 
Регистрация: 07.01.2019
Сообщений: 3
Репутация: 10
По умолчанию

Я так понимаю,
Код:

while (*s1end)

выполняется, пока не закончится строка s1 . Это правильно??
Вот второе условие я не понимаю..
Kuznechik вне форума   Ответить с цитированием
Старый 07.01.2019, 19:37   #5
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 13,620
Репутация: 2400
По умолчанию

Цитата:
Сообщение от Kuznechik Посмотреть сообщение
выполняется, пока не закончится строка s1
Ну и где она заканчивается? Где указатель остановится?

Цитата:
Сообщение от Kuznechik Посмотреть сообщение
Вот второе условие я не понимаю..
А в чем сложности? Есть блоки памяти 1, 2, 3, 4, 5, 6, ... Пусть 1,2,3 занимает перая строка, а 4,5,6 вторая. Вот указатель в начале 1, потом 2, ... потом х. Вот x < 4 или нет?
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x на форуме   Ответить с цитированием
Старый 07.01.2019, 21:56   #6
Kuznechik
Новичок
 
Регистрация: 07.01.2019
Сообщений: 3
Репутация: 10
По умолчанию

?
Цитата:
Сообщение от p51x Посмотреть сообщение
Ну и где она заканчивается? Где указатель остановится?
Цикл будет работать до тех пор пока указатель не укажет на '\0'
значит когда остановится цикл, s1end будет указывать на \0


Цитата:
Сообщение от p51x Посмотреть сообщение
А в чем сложности? Есть блоки памяти 1, 2, 3, 4, 5, 6, ... Пусть 1,2,3 занимает перая строка, а 4,5,6 вторая. Вот указатель в начале 1, потом 2, ... потом х. Вот x < 4 или нет?
Меньше. Но я же не знаю какой адрес займёт первая строка, т.е ее первый элемент. Как я могу сравнить s1 и s2 в первом printf? Я знаю,что они одинаковые во втором printf..
Kuznechik вне форума   Ответить с цитированием
Старый 07.01.2019, 22:48   #7
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 13,620
Репутация: 2400
По умолчанию

Ну, если теорию не читали, то поэксперементируйте с кодом типа:
Код:

int main(){
  int a;
  long b;
  char as[] = "dd";
  char as2[] = "ddd";

  printf("%p\n", &a);
  printf("%p\n", &b);
  printf("%p\n", as);
  printf("%p\n", as2);
}

__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x на форуме   Ответить с цитированием
Старый 17.01.2019, 20:44   #8
lobotaka
 
Регистрация: 05.01.2019
Сообщений: 4
Репутация: 10
По умолчанию

Добрый день. Изучаю язык C. И в данном примере выполнив упражнение оно компилируется некорректно. Потом все же решил посмотреть ответ и дело оказалось в инициализации переменной 'y'. Объясните, пожалуйста, желательно попроще, почему ее необходимо инициализировать непосредственно в цикле for?
Изображения
Тип файла: jpg 1.jpg (100.0 Кб, 2 просмотров)
Тип файла: jpg 2.jpg (103.6 Кб, 3 просмотров)
lobotaka вне форума   Ответить с цитированием
Старый 17.01.2019, 21:47   #9
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 13,620
Репутация: 2400
По умолчанию

Не инициализировать, а сбросить значение. y же фактически содержит номер символа в строке.
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x на форуме   Ответить с цитированием
Старый 18.01.2019, 17:05   #10
lobotaka
 
Регистрация: 05.01.2019
Сообщений: 4
Репутация: 10
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Не инициализировать, а сбросить значение. y же фактически содержит номер символа в строке.
Спасибо. Вроде понял. Получается 'y' доходит до '\0' и если он вне цикла, то его значение продолжает увеличиваться, а если в цикле то возвращается к нулю, верно?
lobotaka вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C++]: Почему функция в этом коде принимает в качестве аргумента указатель на указатель? nwhta Общие вопросы C/C++ 5 04.01.2017 19:09
массив Указатель на указатель fr0st1k123 Общие вопросы C/C++ 3 27.12.2015 19:06
Передать указатель на указатель в функцию erro Общие вопросы C/C++ 3 29.10.2012 17:59
*указатель = *указатель tiger() Общие вопросы C/C++ 7 10.05.2011 12:49
указатель на указатель петя иванов Общие вопросы C/C++ 5 10.04.2011 02:23


20:40.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru