交换C ++数组的2个字符

时间:2016-01-19 08:53:10

标签: c++ arrays for-loop char c-strings

我遇到内存访问问题。当i = 0时,Visual Studio会引用异常,并引用以下代码中标记的行。

无法访问0x00AD8B3B0x00AD8B3B等于scr+np-i

如何修复for-loop主体以解决此问题?

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

3 个答案:

答案 0 :(得分:2)

正如@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*。我们不希望内存泄漏;)

答案 1 :(得分: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);
 }

答案 2 :(得分: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;