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

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

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

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

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

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

Код:
#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 в 18:30.
Kuznechik вне форума Ответить с цитированием
Старый 07.01.2019, 18:22   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

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

И форматируйте код нормально (отступы).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 07.01.2019, 18:24   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от Kuznechik Посмотреть сообщение
-1 (cовсем не понимаю почему..)
На что будет указывать s1end, когда остановится цикл
Код:
while (*s1end)
?
Может ли он "зелезть" на s2? Т.е. выполнится ли условие
Код:
s2 < s1end
?
p51x на форуме Ответить с цитированием
Старый 07.01.2019, 18:32   #4
Kuznechik
Новичок
Джуниор
 
Регистрация: 07.01.2019
Сообщений: 3
По умолчанию

Я так понимаю,
Код:
while (*s1end)
выполняется, пока не закончится строка s1 . Это правильно??
Вот второе условие я не понимаю..
Kuznechik вне форума Ответить с цитированием
Старый 07.01.2019, 18:37   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

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

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

?
Цитата:
Сообщение от 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, 21:48   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Ну, если теорию не читали, то поэксперементируйте с кодом типа:
Код:
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, 19:44   #8
lobotaka
 
Регистрация: 05.01.2019
Сообщений: 4
По умолчанию

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

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

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


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C++]: Почему функция в этом коде принимает в качестве аргумента указатель на указатель? nwhta Общие вопросы C/C++ 5 04.01.2017 18:09
массив Указатель на указатель fr0st1k123 Общие вопросы C/C++ 3 27.12.2015 18: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