g ++ strstr表示从const char *到char *的无效转换

时间:2013-10-10 19:15:13

标签: c++ string

我正在转换用C ++编写的用于Windows的项目。一切都很顺利(这意味着我清楚地看到需要改变哪些东西来制作适当的C ++),直到我点击这个,这是我在关键字=值对的字符串中找到关键字的小常规:

bool GetParameter(const char * haystack, const char *needle) {
    char *search, *start;
    int len;
    len = strlen(needle) + 4;     //  make my own copy so I can upper case it...
    search = (char *) calloc(1,len);
    if (search == NULL) return false;
    strcpy(search,needle);
    strupr(search);
    strcat(search,"=");           //  now it is 'KEYWORD='
    start = strstr(haystack,search);  <---- ERROR from compiler

g ++告诉我“从const char *到char *的转换无效” (投诉的确切位置是参数变量'search')

但似乎g ++是阅读障碍的。因为我实际上正在走其他方式。我将char *传递给const char *

(所以转换是“从char *到const char *”)

strstr原型是char * strstr(const char * ,const char *

这里没有危险。任何const char *都没有被修改 为什么告诉我这个? 我该怎么做才能解决它?

感谢您的帮助。

5 个答案:

答案 0 :(得分:7)

问题的背景是C将函数strstr定义为:

char* strstr(const char*, const char*);

这是因为C不允许重载函数,因此允许您对const和非const字符串使用strstr它接受const字符串并返回非const。这引入了C已经脆弱的类型系统的弱点,因为它从字符串中删除了const-ness。如果您使用不可修改的字符串,则不能尝试通过strstr返回的指针来编写C程序员的工作。

在C ++中,函数被一对重载函数取代,标准说:

  

7。函数签名strstr(const char*, const char*)应由两个声明替换:
      const char* strstr(const char* s1, const char* s2);
      char* strstr( char* s1, const char* s2);
  两者都具有与原始声明相同的行为。

这是类型安全的,如果你传入一个const字符串,你会得到一个const字符串。你的代码传入一个const字符串,所以G ++遵循标准,返回一个const字符串。你得到了你所要求的。

您的代码在Windows上编译,因为您在Windows上使用的标准库显然没有提供重载,只提供C版本。这允许您传入const字符串并返回非const字符串。 G ++提供了标准所要求的C ++版本。该错误告诉您,您正在尝试将const返回值转换为非const char*。解决方案是将返回值分配给const char*,这是可移植的并且可以在任何地方编译。

答案 1 :(得分:3)

虽然将start声明为const char*可能就足够了,但对我来说更合适的是使用std::string个对象:

#include <string>
#include <cctype>
#include <algorithm>

bool GetParameter(const char * haystack, const char *needle) {

    std::string hstr(haystack), nstr(needle);
    std::transform(nstr.begin(), nstr.end(),nstr.begin(), ::toupper);
    nstr += "=";

    std::size_t found = hstr.find(nstr);
    if (found != std::string::npos) {
        ...                                 // "NEEDLE=" found
    }
    else {
        ...
    }
    ...
}

答案 2 :(得分:3)

错误与stsrtr的参数无关。编译器抱怨转换const char *返回的“strstr”。您无法将其分配到仅*start

char *

您可以尝试以下方法之一:

const char *start;

string start(strstr(haystack,search));

答案 3 :(得分:1)

它抱怨的转化是从strstr(...)start。将start的声明更改为const char* start;

答案 4 :(得分:0)

您可以使用类似这样的

start = const_cast<char *>(strstr( haystack, static_cast<const char *>(search) ));