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

Posted

技术标签:

【中文标题】交换 C++ 数组的 2 个字符【英文标题】:Swap 2 char of a C++ array 【发布时间】:2016-04-24 15:52:54 【问题描述】:

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

无法在0x00AD8B3B0x00AD8B3B 访问等于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 个字符的主要内容,如果未能解决你的问题,请参考以下文章

通过套接字在 C++ 和 python 之间交换固定浮点数组

使用 C++ 字符串数组中有多少个字符?

在 C++ 中交换二维双数组

C++ 如何将输入的数读入数组

将二维字符串数组传递给函数时出错 (C++)

[Daimayuan]数组操作(C++,字符串)