我编写了以下程序来匹配C ++中的正则表达式
#include <regex.h>
#include <iostream>
using namespace std;
/*
* Match string against the extended regular expression in
* pattern, treating errors as no match.
*
* return true for match, false for no match
*/
bool match(const char *string, char *pattern)
{
int status; regex_t re;
if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB) != 0)
return false;
/* report error */
status = regexec(&re, string, (size_t) 0, NULL, 0);
regfree(&re);
if (status != 0) {
return false; /* report error */
}
return true;
}
int main()
{
string str = "def fadi 100";
bool matchExp = match(str.c_str(), "^[Dd][Ee][Ff][' '\t]+[A-z]+([,])?[''\t]+[0-9]+$");
cout << (matchExp == true ? "Match": "No match") << endl;
}
该程序正常工作正常,但当我使用带有-Wall -Werror参数的gcc编译代码(Linux环境)时,我收到一条非常恼人的警告消息,说明如下:
main.cpp: In function ‘int main()’:
main.cpp:33:90: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
有没有办法强迫编译器相信str.c_str()
与char * str
相同?如果是这样,怎么样?
答案 0 :(得分:7)
不,没有。该转换在C ++ 03中已弃用,在C ++ 11中是非法的;不要这样做。
转换的弃用来自字符串文字是只读的事实,因此const
;使用指向非const
char
的指针访问它们可能会导致修改const
个对象,从而调用未定义的行为。警告不是烦人的;它旨在帮助您避免可能导致应用程序崩溃 - 或者更糟。
另外,你在阅读警告信息时出错了;它不是c_str()
,而是将字符串文字传递为char *
。
真正修复代码的唯一方法是将match
的第二个参数更改为const char *
,而不是char *
,并将传递的字符串复制到新的缓冲区,内部到那个函数(为什么不在main()
?因为使用内部缓冲区,你在调用者方面的样板更少)。
我还想提出完全不同的解决方案,因为问题标记为“C ++”:Boost.Regex。
答案 1 :(得分:2)
有没有办法强迫编译器相信
str.c_str()
与char *
str相同?
这实际上不是问题 - 您已经将str.c_str()
作为const char*
传递。
问题是第二个参数是(也是)字符串文字,但是类型为char*
。尝试将第二个参数更改为const char*
。
如果仍然会引发错误(由于regex.h
函数未指定正确的常量),您将不得不在{{1}中执行此类操作}或main()
:
match()
请参阅here了解原因。
答案 2 :(得分:1)
问题是字符串文字应该只分配给一个const char的指针,所以你需要改变匹配来获取一个char const *模式(当你传递一个字符串文字时应该可以这样做)
答案 3 :(得分:1)
使函数匹配const char *
的2参数,警告是因为它