【问题标题】:Reversing a char array in C++ causing an error在 C++ 中反转 char 数组会导致错误
【发布时间】:2011-03-28 15:17:22
【问题描述】:

我正在使用以下代码来反转 char 数组。我的代码和错误可以在下面找到。

我的代码:

char * reverseStr(char* s) {
int i=0; //legnth of string
while(s[i]) i++;
char reversed[i];
for(int j=0; j<i; j++) {
    reversed[j] = s[i-j - 1]; //look at this later
}
return *(reversed);
}

错误:

        Compiling...
Compile error: your program did not compile correctly:
program.c: In function 'char* reverseStr(char*)':
program.c:18: error: invalid conversion from 'char' to 'char*'
      --> 17:   }
      --> 18:   return *(reversed);

提前谢谢你!

【问题讨论】:

  • 看起来像是 const 类型的问题。 possibility.com/Cpp/const.html
  • 把完整的代码我认为错误在你代码的另一部分
  • 你为什么返回一个字符而不是反向字符串的指针?
  • 另一件事你不能创建一个变量类型的数组,它必须被修复你可以使用 new 操作符代替 char* reversed=new char[i];数组长度必须在编译时知道
  • 您发布了错误的代码部分 - 错误在第 45 行或附近,可能在对 strcpy 的调用中。

标签: c++ arrays string


【解决方案1】:

你的返回值和类型是错误的。

此外,您的reversed 声明无效,无论如何都会泄漏内存。

另外,不建议使用 std::strlen 来计算字符串长度,标准库有 std::reverse 函数来反转字符串。

【讨论】:

  • :我认为声明char reversed[i];应该导致错误而不是编译,而不是导致内存泄漏,因为i不是const。 C++ AFAIK 不支持VLAs。
  • @Acme 这就是我所说的“无效”。但即使有 VLA 支持和固定的 return 语句,此函数也会泄漏无效指针。
【解决方案2】:

好吧,您返回的是 char 而不是 char*,因此您只返回反转字符串中的第一个字母而不是字符串。这会导致您的错误消息,因为您尝试将 char 视为 char*。

【讨论】:

  • reversed 数组是在函数内部分配的,因此无论如何返回指向它的指针都是个坏主意。
  • 没错,他需要用 new 分配那个数组。
【解决方案3】:

检查错误信息:

program.c: In function 'int itoa2(int, char*, int)':
program.c:45: error: invalid conversion from 'char' to 'const char*'

它清楚地告诉你错误是什么:从 const char* 到 char 的无效转换

【讨论】:

    【解决方案4】:

    在您的代码中,i 不是 const

    char reverseStr(char* s) {
    int i=0; // --->> NOT CONST
    while(s[i]) i++;
    char reversed[i];
    for(int j=0; j<i; j++) {
        reversed[j] = s[i-j - 1]; //look at this later
    }
    return *(reversed);
    }
    

    char reversed[i]; ---> C++ 中的可变长度数组?? i 应该在编译时知道。

    【讨论】:

      【解决方案5】:


      strcpy 接收 (char*, const char*) 作为参数。但是,您的函数的返回类型是 char,因此出现错误。
      并且char reversed[]是分配在函数的栈上的,请不要将其作为返回值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-23
        • 1970-01-01
        • 2014-01-13
        • 2017-02-25
        • 1970-01-01
        • 2018-12-05
        • 2016-03-11
        • 2015-07-29
        相关资源
        最近更新 更多