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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> reverse string, Перевернуть строку 
V
    Опции темы
MightyCat
Дата 1.4.2009, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Имеется код :
Код

#include <iostream>
#include <string>
using namespace std;

void reverse(char *str, int count){
    int i, j;
    char temp;

    if(!count) count = strlen(str) - 1;

    for(i=0, j=count; i<j; j++, i--) {
        temp = str[ i ];
        str[ i ] = str[ j ];
        str[ j ] = temp;
    }
}


int main(){
    char *s1 = "abcdefgh";
    reverse(s1, 7);
    cout << s1 << '\n';
    return 0;
}


вот на 
Код
 str[ i ] = str[ j ]; 
 вылетает... что не так?
PM MAIL ICQ   Вверх
mes
Дата 1.4.2009, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(MightyCat @  1.4.2009,  20:15 Найти цитируемый пост)
for(i=0, j=count; i<j; j++, i--) {

не перепутали ли Вы случайно какую из переменных надо инкрементировать, а кукую декрементировать ?  smile 


Это сообщение отредактировал(а) mes - 1.4.2009, 21:21


--------------------
PM MAIL WWW   Вверх
MightyCat
Дата 1.4.2009, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ой, точно  smile 
Но, это проблему не решает :(
PM MAIL ICQ   Вверх
mes
Дата 1.4.2009, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(MightyCat @  1.4.2009,  20:15 Найти цитируемый пост)
    char *s1 = "abcdefgh";

тут тоже будет вылетать, так как (на многих современных компиляторах) указатель будет ссылаться на память_только_для_чтения.
Поэтому замените на
Код

  char s1 []= "abcdefgh";


Цитата(MightyCat @  1.4.2009,  20:15 Найти цитируемый пост)
 '\n';

а вместо этого логичнее использовать std::endl

Это сообщение отредактировал(а) mes - 1.4.2009, 21:26


--------------------
PM MAIL WWW   Вверх
MightyCat
Дата 1.4.2009, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(mes @  1.4.2009,  21:24 Найти цитируемый пост)
указатель будет ссылаться на память_только_для_чтения

Вот, то что было нужно smile 
Спасибо smile
PM MAIL ICQ   Вверх
mes
Дата 1.4.2009, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(MightyCat @  1.4.2009,  20:15 Найти цитируемый пост)
{
        temp = str[ i ];
        str[ i ] = str[ j ];
        str[ j ] = temp;
    }

а вместо этих строчек, достаточно одной std::swap (str[ i ],  str[ j ]);

Добавлено @ 21:31
Цитата(MightyCat @  1.4.2009,  20:15 Найти цитируемый пост)
    int i, j;
  for(i=0, j=count; i<j; j++, i--) 

также переменные цикла лучше объявлять внутри определения цикла..


Это сообщение отредактировал(а) mes - 1.4.2009, 21:32


--------------------
PM MAIL WWW   Вверх
MightyCat
Дата 1.4.2009, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(mes @  1.4.2009,  21:24 Найти цитируемый пост)
Цитата(MightyCat @  1.4.2009,  20:15 )
 '\n';


а вместо этого логичнее использовать std::endl




Цитата(mes @  1.4.2009,  21:29 Найти цитируемый пост)
Цитата(MightyCat @  1.4.2009,  20:15 )
{
        temp = str[ i ];
        str[ i ] = str[ j ];
        str[ j ] = temp;
    }


а вместо этих строчек, достаточно одной std::swap (str[ i ],  str[ j ]); 


Ну, это понятно... просто было не понятно, почему было нарушение прав доступа при записи.... но, т.к. память только для чтения, то удивляться нечему smile
PM MAIL ICQ   Вверх
mes
Дата 1.4.2009, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(MightyCat @  1.4.2009,  20:31 Найти цитируемый пост)
Ну, это понятно... просто было не понятно, почему было нарушение прав доступа при записи.... но, т.к. память только для чтения, то удивляться нечему smile 

это я так..на будущее.. ошибок нет, но чтоб код красивее выглядел поправляю. smile


--------------------
PM MAIL WWW   Вверх
MightyCat
Дата 1.4.2009, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(mes @  1.4.2009,  21:33 Найти цитируемый пост)
это я так..на будущее.. ошибок нет, но чтоб код красивее выглядел поправляю.

И продолжайте это делать и дальше smile
PM MAIL ICQ   Вверх
mes
Дата 1.4.2009, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(MightyCat @  1.4.2009,  20:15 Найти цитируемый пост)
void reverse(char *str, int count){

а также логично было бы добавить значение по умолчанию :
Код

void reverse(char *str, int count=0){


Это сообщение отредактировал(а) mes - 1.4.2009, 21:35


--------------------
PM MAIL WWW   Вверх
MightyCat
Дата 1.4.2009, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(mes @  1.4.2009,  21:35 Найти цитируемый пост)
а также логично было бы добавить значение по умолчанию :
void reverse(char *str, int count=0){ 


А оно там и так есть smile Я просто хотел узнать, чего при выполнении ошибка  smile
PM MAIL ICQ   Вверх
mes
Дата 1.4.2009, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(MightyCat @  1.4.2009,  20:37 Найти цитируемый пост)
А оно там и так есть smile

ну  я не телепат, что показали на то и ориентируюсь .. а что на самом деле Вам виднее smile


--------------------
PM MAIL WWW   Вверх
MightyCat
Дата 1.4.2009, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Еще раз спасибо smile
PM MAIL ICQ   Вверх
bsa
Дата 1.4.2009, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



еще один вариант:
Код
#include <algorithm>
#include <string>

//...

std::string source = "asdfghjkl";
std::string result;

//собственно инвертирование - результат будет в result
std::copy(source.rbegin(), source.rend(), std::back_inserter(result));

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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