交换 C++ 数组的 2 个字符
Posted
技术标签:
【中文标题】交换 C++ 数组的 2 个字符【英文标题】:Swap 2 char of a C++ array 【发布时间】:2016-04-24 15:52:54 【问题描述】:我的内存访问有问题。当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;
【问题讨论】:
这个函数怎么调用?你传递什么作为参数? 打赌你会向这个函数传递一个常量字符串,比如字符串文字。 并且 (!scr) 检查在 stlen(scr) 被调用之前... 你不使用标准库有什么原因吗? 【参考方案1】:正如@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*
。我们不希望内存泄漏;)
【讨论】:
【参考方案2】:我看到您正在尝试反转字符串。 我可以建议一种更简单的方法吗
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);
【讨论】:
【参考方案3】:您很可能使用字符串文字调用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] = '\0';
o_strrev(my_string);
// ...
delete[] my_string;
【讨论】:
@TobiMcNamobi 编辑答案是一个 :)以上是关于交换 C++ 数组的 2 个字符的主要内容,如果未能解决你的问题,请参考以下文章