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编辑的答案为:)