交换 C++ 数组的 2 个字符
Swap 2 char of a C++ array
我的内存访问有问题。当 i = 0
、Visual Studio 抛出异常并引用以下代码中标记的行。
无法在 0x00AD8B3B
访问并且 0x00AD8B3B
等于 scr+np-i
如何修复for循环体来解决这个问题?
int o_strrev(char* scr)
{
int np = strlen(scr) - 1;
char tmp;
if (!scr) return -1;
if (!*scr) return -1;
for (int i = 0; i < np / 2; i++)
{
tmp = scr[np-i];
scr[np-i] = scr[i]; # this line
scr[i] = tmp;
}
return 0;
}
我看到您正在尝试反转字符串。
我可以建议一个更简单的方法吗
void reverse(char *string_var)
{
int length, c;
char *begin, *end, temp;
length = strlen(string_var);
begin = string_var;
end = string_var;
for (c = 0; c < length - 1; c++)
end++;
for (c = 0; c < length/2; c++)
{
temp = *end;
*end = *begin;
*begin = temp;
begin++;
end--;
}
}
确保传递
形式的字符数组
char word[64]
或者通过递归
void reverse(char *x, int begin, int end)
{
char c;
if (begin >= end)
return;
c = *(x+begin);
*(x+begin) = *(x+end);
*(x+end) = c;
reverse(x, ++begin, --end);
}
正如@Revolver_Ocelot 所指出的,您可能正在从字符串文字中传递 const char*
。由于根据定义,这些是常量,因此您不能按照您尝试的方式修改它们。您需要一些方法将 const char*
转换为非常量 char*
。这些方面的内容对您有用:
string str = "string";
char* cstr = new char[str.length() + 1];
strcpy(cstr, str.c_str());
我已经使用非常量 char*
在 g++ 中编译了您的代码,并且运行良好。请记住在完成后释放 char*
。我们不希望内存泄漏 ;)
您很可能使用字符串文字调用 o_strrev
,例如:
o_strrev("This ain't gonna work!");
这将与大多数编译器一起编译并且最多生成一个警告。尝试提高警告级别。
相反,您想在堆上创建字符串的动态副本并使用指向它的 char*
指针,例如:
string str = "This is gonna work!!"
size_t len = str.size();
char* my_string = new char[len + 1];
strncpy(my_string, str.data(), len)
my_string[len] = '[=11=]';
o_strrev(my_string);
// ...
delete[] my_string;
我的内存访问有问题。当 i = 0
、Visual Studio 抛出异常并引用以下代码中标记的行。
无法在 0x00AD8B3B
访问并且 0x00AD8B3B
等于 scr+np-i
如何修复for循环体来解决这个问题?
int o_strrev(char* scr)
{
int np = strlen(scr) - 1;
char tmp;
if (!scr) return -1;
if (!*scr) return -1;
for (int i = 0; i < np / 2; i++)
{
tmp = scr[np-i];
scr[np-i] = scr[i]; # this line
scr[i] = tmp;
}
return 0;
}
我看到您正在尝试反转字符串。 我可以建议一个更简单的方法吗
void reverse(char *string_var)
{
int length, c;
char *begin, *end, temp;
length = strlen(string_var);
begin = string_var;
end = string_var;
for (c = 0; c < length - 1; c++)
end++;
for (c = 0; c < length/2; c++)
{
temp = *end;
*end = *begin;
*begin = temp;
begin++;
end--;
}
}
确保传递
形式的字符数组char word[64]
或者通过递归
void reverse(char *x, int begin, int end)
{
char c;
if (begin >= end)
return;
c = *(x+begin);
*(x+begin) = *(x+end);
*(x+end) = c;
reverse(x, ++begin, --end);
}
正如@Revolver_Ocelot 所指出的,您可能正在从字符串文字中传递 const char*
。由于根据定义,这些是常量,因此您不能按照您尝试的方式修改它们。您需要一些方法将 const char*
转换为非常量 char*
。这些方面的内容对您有用:
string str = "string";
char* cstr = new char[str.length() + 1];
strcpy(cstr, str.c_str());
我已经使用非常量 char*
在 g++ 中编译了您的代码,并且运行良好。请记住在完成后释放 char*
。我们不希望内存泄漏 ;)
您很可能使用字符串文字调用 o_strrev
,例如:
o_strrev("This ain't gonna work!");
这将与大多数编译器一起编译并且最多生成一个警告。尝试提高警告级别。
相反,您想在堆上创建字符串的动态副本并使用指向它的 char*
指针,例如:
string str = "This is gonna work!!"
size_t len = str.size();
char* my_string = new char[len + 1];
strncpy(my_string, str.data(), len)
my_string[len] = '[=11=]';
o_strrev(my_string);
// ...
delete[] my_string;