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

|| 我正在做一个作业,要求我自己使用指向序列“ \”的指针和指向“ \”的指针来反转字符序列,该字符序列可以是任何给定类型。序列。 在当前版本中,我首先尝试切换\“ front \”和\“ end \”字符。但是,我在运行时收到“访问冲突”。 我目前的代码:
#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;
    }
}
这个问题的关键限制是必须使用指针来完成反转。我意识到简单地反转一个字符串是微不足道的,但是这种限制让我挠头。任何建设性的意见将不胜感激!     
已邀请:
您将字符串文字
\"aDb3EfgZ\"
分配给
cStr
,并且字符串文字不能被修改。您的编译器很可能会将字符串文字存储在只读存储器中,并且当您尝试写入
*front
时,会因此而发生访问冲突。 要获取可修改的字符串,请复制文字。例如:
const char *cLit = \"aDb3EfgZ\";
cStr = new char[strlen(cLit)+1];
strcpy(cStr, cLit);
有关更多详细信息,请参见此问题以及“链接的”部分中提到的问题。     
您的代码有几个问题。对于初学者,为什么要上课? 我希望可以通过一个简单的功能完成此操作:
void reverse( char* begin, char* end );
而且您不需要索引,因为您已经有了指针。您 可以只增加和减少指针。 另外,为什么还要在构造函数中分配内存。你的记忆 永远不要使用(或免费)。 最后,您并没有真正使循环中的任何内容逆。你需要 交换字符,而不仅仅是将最后一个复制到 开始。 至于访问冲突:字符串文字是一个常量。您 无法修改。如果要进行相反的操作,则需要 将字符串复制到其他位置(或使用它初始化数组)。     
您的构造函数将泄漏内存,因为您松开了分配前端和后端的指针,甚至不需要这些分配。对于您的问题,您可以使用
while(*endptr) endptr++;
循环遍历字符串以找到结尾,然后从字符串的大小为
endptr - startptr;
,您可以使用它分配临时缓冲区,因此您可以执行
while(startptr != endptr) *tempbuf++ = *endptr--;
,然后释放旧字符串并设置临时缓冲区作为新字符串     
就地逆转的基本技术: 获得指向字符串中第一个字符的指针(称为“ \'left \”)。 获取指向字符串中最后一个字符的指针(称其为“'right \')(不计算尾随的NUL字符) 而左指针小于右指针 交换每个指针所在的字符 增加左指针 递减右指针 这就是全部。字符串的反向副本的产生需要更多的工作。     

要回复问题请先登录注册