Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Реверсирование строк 
:(
    Опции темы
Golovastik
Дата 7.9.2009, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 19.7.2009

Репутация: -1
Всего: 0



Всем  добрый вечер! Как всегда, практикуюсь по книжным примерам. Вот дошёл до темы реверсирования строк, то есть расположения букв в обратном порядке. Столкнулся с таким кодом, и не ясен стал цикл,то есть как именно происходит замена букв в нём?
Если кто может, подскажите,если не сложно? Не ясен сам цикл, и строка перед ним: end = &str[len-1];
 Заранее благодарю.

Вот исходник:
Код



#include <iostream>
using namespace std;

int main() 
{
setlocale(0, "" ); 
char str[] = "Россия - щедрая душа";
char *start, *end;
int len;
char t;

cout<<"Исходная строка: "<<str<<'\n';
len = strlen(str);
start = str;
end = &str[len-1];
while(start < end)
{
    t = *start;
    *start = *end;
    *end = t;
    start++;
    end--;
}
cout<<"Результат после реверсирования: \n"<<str;

cin.get();
return 0;
 
}




Это сообщение отредактировал(а) Golovastik - 7.9.2009, 23:33
PM MAIL   Вверх
ller
Дата 7.9.2009, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.8.2008
Где: г. Таганрог

Репутация: 2
Всего: 4



end = &str[len-1]; Адрес предпоследнего элемента массива. В С строка заканчивается \0 символом, и он всегда последний.
Код

while(start < end) //Пока адрес start больше end. т.е. не прошли середину
{
    t = *start;   Запоминается во временную переменную символ в начале(вернее в первой половине) строки
    *start = *end; Потом на его место записывается символ из второй половины строки
    *end = t;         Во вторую половину строки записываем сохраненный символ
    start++;          Сдвигаемся на один символ к концу от начала строки
    end--;             Сдвигаемся на один символ к началу строки от конца...
}


А вообще есть такая вещь как деагер, пошаговый проход очень помогает, все видно что куда, откуда.

Это сообщение отредактировал(а) ller - 7.9.2009, 23:41
PM MAIL   Вверх
andrew_121
Дата 8.9.2009, 01:04 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Код

#include <algorithm>
std::reverse(start, end);



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
zim22
Дата 8.9.2009, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



если С, то strrev


--------------------
PM MAIL   Вверх
Golovastik
Дата 8.9.2009, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 19.7.2009

Репутация: -1
Всего: 0



 Что-то я не могу понять вот эту строку:



Код

while(start < end)



Ведь смотрите, строка Россия - щедрая душа, занимает 20 символов+нулевой символ окончания = 21.
Теперь происходит такое условие: "Пока 21(тоесть start) < 20(end)".
Как может 21 быть меньше 20,ведь тогда цикл прекратится сразу.
Как это понимать?

PM MAIL   Вверх
IKM2007
Дата 8.9.2009, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



Цитата(Golovastik @  8.9.2009,  19:58 Найти цитируемый пост)
Теперь происходит такое условие: "Пока 21(тоесть start) < 20(end)".

Здесь start и end адреса в памяти, start указывает на начало массива(строки), а end на конец массива(строки) и с каждым шагом(start++, end--) они "приближаются" к центру, то есть друг к другу, и пока start не "перепрыгнул" через end, цикл будет продолжатся.


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0491 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.