仅使用指针反转字符串/字符序列

时间:2011-04-21 17:11:05

标签: c++ arrays string pointers

我正在进行一项任务,要求我自己反转一系列字符,这些字符可以是任何给定类型,使用指向序列“前”的指针和指向序列“结束”的指针

在我当前的版本中,我首先尝试切换“前”和“结束”字符。但是,我在运行时收到“访问冲突”。

我的代码:

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

class StrReverse
{
public:
    StrReverse(); //default constructor

    void revStr(); //reverses a given c-string
private:
    typedef char* CharPtr;
    CharPtr front;
    CharPtr end;
    CharPtr cStr;
};

int main()
{
    StrReverse temp = StrReverse();
    temp.revStr();
    system("pause");

    return 0;
}

//default constructor
StrReverse::StrReverse()
{
    cStr = "aDb3EfgZ";
    front = new char;
    end = new char;
}

//reverses a given string
void StrReverse::revStr()
{
    for(int i = 0;i < 4;i++)
    {
        front = (cStr + i);
        end = (cStr + (7 - i));
        *front = *end;
    }
}

这个问题的关键限制是必须使用指针完成反转。我意识到简单地反转一个字符串是微不足道的,但这种限制让我摸不着头脑。任何建设性的意见将不胜感激!

4 个答案:

答案 0 :(得分:2)

您将字符串文字"aDb3EfgZ"分配给cStr,并且无法修改字符串文字。您的编译器很可能将字符串文字存储在只读内存中,当您尝试写入*front时,您会因此而受到访问冲突。

要获取可修改的字符串,请复制文字。例如:

const char *cLit = "aDb3EfgZ";
cStr = new char[strlen(cLit)+1];
strcpy(cStr, cLit);

有关详细信息,请参阅示例this question以及“链接”部分中提到的内容。

答案 1 :(得分:1)

您的代码存在一些问题。对于初学者来说,为什么上课; 这是我希望用一个简单的函数完成的事情:

void reverse( char* begin, char* end );

你不需要索引,因为你已经有了指针;您 可以只增加和减少指针。

另外,为什么要在构造函数中分配内存。记忆你 永远不要使用(或免费)。

最后,你并没有在你的循环中反转任何东西。你需要 交换字符,而不只是将最后一个字符复制到一个字符处 一开始。

至于访问冲突:字符串文字是一个常量。您 无法修改它。如果你想做相反的事情,你需要 将字符串复制到其他地方(或使用它来初始化数组)。

答案 2 :(得分:0)

你的构造函数会泄漏内存,因为你松开了你分配前端和后端的指针,甚至不需要那些分配。至于你的问题,你可以循环使用while(*endptr) endptr++;找到结尾的字符串,从那里你可以用endptr - startptr;来分配一个临时缓冲区,这样就可以{{1}然后释放旧字符串并将临时缓冲区设置为新字符串

答案 3 :(得分:0)

就地逆转的基本技术:

  • 获取一个指针(称之为'left')到字符串中的第一个字符。
  • 获取一个指针(称之为'右')到字符串中的最后一个字符(不包括尾随的NUL字符)
  • ,而左指针小于右指针
    • 交换每个指针所在的字符
    • 增加左指针
    • 递减右指针

这就是它的全部内容。制作字符串的反向副本需要更多的工作。