我有这段代码:
#include <iostream>
#include <string.h>
using namespace std;
void copyString(char *input, int offset, int length, bool invert, char *output, int output_offset)
{
char *cp = new char[length+1];
for (int i = 0; i < length + 1; i++)
{
cp[i] = input[offset + i];
}
if (invert)
{
for (int i = 0; i < length/2; i++)
{
swap(cp[i], cp[length - i - 1]);
}
}
int count = 0;
while (output[count])
count++;
int cutlength = count - output_offset;
char *temp = new char[count + 1];
for (int i = 0; i < count + 1; i++)
temp[i] = output[i];
for (int i = 0; i < cutlength; i++)
{
temp[output_offset + i] = cp[i];
}
output = temp;
}
void main()
{
char *st = "Hello world";
cout << "st= " << st << endl;
char *st2 = "My name is C++";
cout << "st2= " << st2 << endl;
copyString(st, 6, 5, true, st2, 11);
cout << "st2 output= " << st2 << endl;
system("Pause");
}
这个想法是该函数将复制输入字符串的长度,并用复制的字符串替换输出的一部分。
我想要做的就是在copyString函数之后使 st2值改变,但我似乎无法通过 temp var来改变它。但是,如果我尝试更改函数中的 st2 值,则会出现访问冲突错误。知道如何解决这个问题吗?
答案 0 :(得分:0)
您的fcs
函数通常类似于C copyString
函数(如果不将反转选项带入帐户)。它需要输出为已分配的足够大小的缓冲区(strcpy
数组)以将字符串内容写入(例如,您可以使用char
分配缓冲区)。但是,您尝试写入字符串常量new char[strlen(str) + 1]
和"Hello world"
所在的内存。这显然是内存访问冲突(否则你会修改这些常量)。
无需说这种处理字符串的方式非常容易出错,而且远非C ++。
答案 1 :(得分:0)
1)您计算output
长度(未定义的行为!),而不是input
长度。
2)output
指针无处可去 - 你想为它使用引用函数参数吗?
答案 2 :(得分:0)
st和st2是指向常量字符串的指针,因此你不应该尝试更改那些内容(尽管你可以让它们指向完全不同的字符串)。
要使st2成为可编辑的字符数组(字符串),您应该按如下方式声明st2
char st2[] = "My name is C++";
在copyString函数中,输出指针最初指向与st2相同的位置,然后在函数的末尾使输出点位于不同的字符串。然而,这不会以任何方式改变st2或其内容。
你需要让st2成为一个字符数组并在copyString函数中编辑这个数组,或者让copyString函数创建并返回一个st2可以指向的新字符串(尽管如果不是你可能会导致内存泄漏)小心)。
以下应该做你想做的事。通过完全删除cp并直接从输入缓冲区写入输出缓冲区,可以稍微改进一下。
void copyString(char *input, int offset, int length, bool invert, char *output, int output_offset)
{
char *cp = new char[length+1];
for (int i = 0; i < length + 1; i++)
{
cp[i] = input[offset + i];
}
if (invert)
{
for (int i = 0; i < length/2; i++)
{
swap(cp[i], cp[length - i - 1]);
}
}
int count = strlen(output);
int cutlength = count - output_offset;
for (int i = 0; i < cutlength; i++)
{
output[output_offset + i] = cp[i];
}
delete[] cp;
}
void main()
{
char st[] = "Hello world";
cout << "st= " << st << endl;
char st2[] = "My name is C++";
cout << "st2= " << st2 << endl;
copyString(st, 6, 5, true, st2, 11);
cout << "st2 output= " << st2 << endl;
system("Pause");
}
答案 3 :(得分:0)
内存访问冲突是由于您正在尝试修改字符串,其大小无法容纳额外的长度(即您的情况下为st2)
注意:当您更新st2&lt; - temp。
的基址时,Temp方法可以正常工作还可以对偏移和边界进行边界检查。还建议使用输入参数长度。 通常使用 strcpy_s 优先于 strcpy 。