Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > reverse string


Автор: MightyCat 1.4.2009, 21:15
Имеется код :
Код

#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 ]; 
 вылетает... что не так?

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

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

Автор: MightyCat 1.4.2009, 21:24
Ой, точно  smile 
Но, это проблему не решает :(

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

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

  char s1 []= "abcdefgh";


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

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

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

Вот, то что было нужно smile 
Спасибо smile

Автор: 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 ]);

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

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

Автор: MightyCat 1.4.2009, 21:31
Цитата(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

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

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

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

И продолжайте это делать и дальше smile

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

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

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

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


А оно там и так есть smile Я просто хотел узнать, чего при выполнении ошибка  smile

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

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

Автор: MightyCat 1.4.2009, 21:45
Еще раз спасибо smile

Автор: bsa 1.4.2009, 23:29
еще один вариант:
Код
#include <algorithm>
#include <string>

//...

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)