交换C++数组中的两个字符

3

我遇到了内存访问问题。当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;
}

4
你怎么称呼这个函数?你需要传入什么参数? - πάντα ῥεῖ
10
打赌你会将一个常量字符串,比如字符串字面量,传递给这个函数。 - Revolver_Ocelot
5
在调用stlen(scr)之前需要进行(!scr)的检查... - Prabindh
你为什么不使用标准库呢? - TobiMcNamobi
3个回答

2

正如@Revolver_Ocelot所指出的那样,你可能正在传递字符串常量的const char*。由于这些常量是不可改变的,因此你无法以你试图的方式修改它们。你需要一些方法将const char*转换为非常量的char*。以下代码可以解决你的问题:

string str = "string";
char* cstr = new char[str.length() + 1];
strcpy(cstr, str.c_str());

我用g++编译了您的代码,使用非常量的char*,它可以正常工作。只要记得在使用完后释放您的char*。我们不想发生内存泄漏;)


1

我看到你正在尝试反转一个字符串。 我可以建议一种更简单的方法。

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);
 }

1
您很可能正在使用字符串字面量调用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 编辑了答案,现在是正确的。 - Paul Evans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接