我正在进行一项任务,要求我自己反转一系列字符,这些字符可以是任何给定类型,使用指向序列“前”的指针和指向序列“结束”的指针
在我当前的版本中,我首先尝试切换“前”和“结束”字符。但是,我在运行时收到“访问冲突”。
我的代码:
#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;
}
}
这个问题的关键限制是必须使用指针完成反转。我意识到简单地反转一个字符串是微不足道的,但这种限制让我摸不着头脑。任何建设性的意见将不胜感激!
答案 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)
就地逆转的基本技术:
这就是它的全部内容。制作字符串的反向副本需要更多的工作。