【问题标题】:Swap 2 char of a C++ array交换 C++ 数组的 2 个字符
【发布时间】: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) 被调用之前...
  • 你不使用标准库有什么原因吗?

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


【解决方案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 编辑答案是一个 :)
      猜你喜欢
      • 1970-01-01
      • 2022-01-06
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多