我正在转换用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 *都没有被修改 为什么告诉我这个? 我该怎么做才能解决它?
感谢您的帮助。
答案 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) ));