使用 Visual Studio Community 2015 C++
使用意想不到的结果
源代码:
#include <regex>
int main()
{
std::regex re("^(.)=(\\d{1,2})/(\\d{1,2})*$");
std::cmatch cm;
std::regex_match("f=12/64", cm, re);
for (unsigned idxMatch = 0; idxMatch < cm.size(); idxMatch++)
{
printf("Found Match %d '%s'\n", idxMatch, cm[idxMatch]);
}
return 0;
}
Results:
找到匹配 0 'f=12/64'
找到匹配 1 'f=12/64'
找到匹配 2“12/64”
找到匹配 3 '4'
预期成绩:
找到匹配 0 'f=12/64'
找到匹配 1 'f'
找到匹配 2 '12'
找到第 3 场比赛“64”
评论:
正则表达式在多个其他正则表达式系统上正常工作
包括 C、Perl、Java 和 Javascript。
正则表达式在我遇到的每个多个在线测试器上都能正常工作
尝试过。
我尝试转义“/”,结果出乎意料地相同。
我在 Microsoft 网站上没有发现可能存在错误正则表达式的线索。
问题是你正在使用printf
格式说明符错误。这cm[idxMatch]
不是一个以 null 结尾的字符串,因此%s
说明符将不起作用。当您提供错误的数据类型来匹配输出说明符时,行为未定义。
最简单的解决方案是使用std::cout
,以及一般类型安全的输出流。
使用 Visual Studio 2015 和 std::cout 的实时示例 http://rextester.com/FJJYT56856
为了解决这个问题,这是您使用的示例printf
。请注意输出的奇怪之处:
这是 printf 的怪异和 Visual Studio 2015 http://rextester.com/NKUPR51002
编辑:对于 g++,使用时出现运行时错误printf
.
g++ printf 运行时错误 http://rextester.com/BUH81778
使用时std::cout
,我们得到所需的输出:
g++ 使用 std::cout http://rextester.com/PQVN6423
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)