Как обратить массив символов с помощью указателя члена класса?

0

im tryin для изменения массива с использованием указателя, который является членом класса:

#include <iostream>
#include <cstring>
#include <string>

using namespace std;

class my_string
{
    char* ptr;
    int size;
public:
    my_string(){};
    my_string(char* str) : ptr(str),size(strlen(ptr)){};
    char* getstr () {return ptr;};
    void reverse();
    int find (char);
    void print();
};

void my_string::reverse()
{
     int size2=size;
     for (int i=0;i<(size/2);i++)
       {
           char tmp=ptr[i];
           ptr[i]=ptr[size2-1];
           ptr[size2-1]=ptr[i];
           size2--;
       }
}

int my_string::find(char c)
{
    for (int i=0;i<size;i++)
     {
        if (ptr[i]==c)
        return i;
     }
    return -1;
}

void my_string::print()
{
    for (int i=0;i<size;i++)
        cout<<ptr[i];
    cout<<endl;
}


int main()
{
    my_string s1("abcde");
    s1.print(); 
    s1.reverse();
    s1.print();
}

im не получить никаких ошибок, но обратная функция, безусловно, не работает. может кто-нибудь объяснить мне почему?

* Это домашнее задание, в котором просить меня не использовать динамическое распределение или строки (пока).

  • 1
    у вас есть size2-1 , я думаю, это должен быть size2-i
Теги:
arrays
pointers

2 ответа

1

Вы не упоминали, что не можете использовать стандартные библиотечные алгоритмы, поэтому

std::reverse(ptr, ptr+size);
1

Вы можете использовать стандартный алгоритм std::reverse объявленный в заголовке <algorithm>. Например

std::reverse( ptr, ptr + size );

Но если вы хотите сделать это самостоятельно, то функция может выглядеть следующим образом

void my_string::reverse()
{
     for ( int i = 0; i < size/2; i++ )
     {
           char tmp = ptr[i];
           ptr[i] = ptr[size-1-i];
           ptr[size-1-i] = tmp;
     }
}

Тест-программа

#include <iostream>
#include <cstring>

int main()
{
    char s[] = "123456789";
    char *ptr = s;
    int size = std::strlen( ptr );

    std::cout << s << std::endl;

    for ( int i = 0; i < size/2; i++ )
    {
              char tmp = ptr[i];
              ptr[i] = ptr[size-1-i];
              ptr[size-1-i] = tmp;
    }

    std::cout << s << std::endl;
}

Выход

123456789
987654321
  • 0
    Я попытался скопировать ответ, который вы разместили, но он все еще не работает. я даже попытался использовать реверс с функциями-членами, одну из которых я только что объявил: code char * getstr () {return ptr;}; char * getstrsize () {return ptr + size;}; code
  • 0
    Это рабочий код.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню