交换 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;