C++ 交换2个字符的C++;排列
我的内存访问有问题。当C++ 交换2个字符的C++;排列,c++,arrays,for-loop,char,c-strings,C++,Arrays,For Loop,Char,C Strings,我的内存访问有问题。当i=0时,VisualStudio会抛出一个异常,该异常引用以下代码中标记的行 无法在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=0
时,VisualStudio会抛出一个异常,该异常引用以下代码中标记的行
无法在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;
}
into_strev(char*scr)
{
int np=strlen(scr)-1;
char-tmp;
如果(!scr)返回-1;
如果(!*scr)返回-1;
对于(int i=0;i
我看到您正在尝试反转字符串。
我能建议一个更简单的方法吗
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--;
}
}
或者通过递归
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\u 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_strev
,例如:
o_strrev("This ain't gonna work!");
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] = '\0';
o_strrev(my_string);
// ...
delete[] my_string;
这将使用大多数编译器编译,最多生成一个警告。试着提高你的警告级别
相反,您希望在堆上创建字符串的动态副本,并使用指向该字符串的char*
指针,例如:
o_strrev("This ain't gonna work!");
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] = '\0';
o_strrev(my_string);
// ...
delete[] my_string;
这个函数怎么叫?您将什么作为参数传递?我打赌您将一个常量字符串(如字符串文字)传递给此函数。在调用stlen(scr)之前,请先检查(!scr)…是否有不使用标准库的原因?@TobiMcNamobi编辑的答案为:)