2014-02-04 2 views
0

им пытается отменить массив с помощью указателя, который является членом класса:Как изменить массив символов с помощью указателя на элемент?

#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(); 
} 

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

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

+1

у вас 'size2-1', я думаю он должен быть 'size2-i' – dave

ответ

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

Я попытался скопировать ответ u, но он все еще не работает. я даже попытался использовать reverse с функциями-членами, которые один из них я просто решил теперь: 'code' char * getstr() {return ptr;}; \t char * getstrsize() {return ptr + size;}; 'code' – user3194267

+0

Это рабочий код. –

+1

Я могу предположить, что вы используете строковый литерал в качестве аргумента конструктора. Вы не можете использовать строковые литералы таким способом. Они не могут быть изменены. –

Смежные вопросы