“1”的 C++ 字符串与“1”不匹配(尝试了正则表达式和布尔值 '==')
Posted
技术标签:
【中文标题】“1”的 C++ 字符串与“1”不匹配(尝试了正则表达式和布尔值 \'==\')【英文标题】:C++ string of "1" does not match "1" (tried regex and boolean '==')“1”的 C++ 字符串与“1”不匹配(尝试了正则表达式和布尔值 '==') 【发布时间】:2015-10-31 01:01:37 【问题描述】:查看 gif(Visual Studio 调试器显示变量): http://www.elanhickler.com/transfer/regex_does_not_match.gif
bool stob(string s)
regex e("1");
bool b1 = (s == "1"); // false
bool b2 = (string(s) == "1"); // false
bool does_it_match1 = regex_match("1", e); // true
bool does_it_match2 = regex_match(string(s), e); // false
bool does_it_match3 = regex_match(string("1"), e); // true
return does_it_match1;
为什么不匹配?
图片显示 s 的输入是“1”,更具体地说是 49("1")
和 0("\0")
的字符
ideone:https://ideone.com/b8luZF(这说明了问题,感谢下面的答案解决了)。
#include <iostream>
#include <regex>
#include <string>
using namespace std;
int main()
regex e("1");
string s = "1,";
s.back() = '\0';
cout << regex_match("1", e) << endl;
cout << regex_match(s, e) << endl;
return 0;
【问题讨论】:
尝试打印出带有引号的字符串s
,例如std::cout << "s = \"" << s << "\"\n";
这样您就可以很容易地看到它是什么,以及它是否包含任何前导/尾随空格。
刚刚添加了一张图片。它可能是空终止吗?
您的结果与s
一致,实际上并不包含1
。为了改进您的问题,请发布一个包含传递给函数的值的 MCVE。
好吧,调试器确实说s
的大小是两个字符。除非您手动将大小设置为 2,否则不应这样做。不,大小不应该包括终止符。你能告诉我们你是如何初始化s
的吗?你如何调用函数?您能不能尝试创建一个Minimal, Complete, and Verifiable Example 向我们展示?
@Joachim Pileborg 正在研究它
【参考方案1】:
与 C 字符串不同,C 字符串从指针指向的位置开始并在第一个 0 字节之前结束,std::string
s 实际上可以包含 0 字节。您的字符串似乎正是这种情况。根据您的调试器,该字符串包含两个字符,第一个是'1',第二个是'\0'。
因此,您将 2 个字符的字符串与 1 个字符的字符串进行比较,因此结果为 false。
【讨论】:
当你说 string a="1" 时,它还是把它作为 1\0 保存在内存中? @GRC:不。(实际上每个实现细节都是肯定的,但这在这里无关紧要。)所以调试器表明这不是什么是OP正在提供功能。我们要求他们提供适当测试用例的另一个原因。很明显,当他们是不理解问题的人时,“我只相信我传递给函数的东西,因此你也必须如此”是不够的! 我刚刚做了if (s.back() == '\0') s.pop_back();
,它解决了问题……但这危险吗?
@ElanHickler:这不是“危险的”,但它表明调用范围中的错误/错误/问题,您应该从源头修复。
我想我找到了问题所在。在另一个函数中,我正在做descriptions.back() = '\0'; values.back() = '\0';
换句话说,我正在向一个字符串添加一个空终止,该字符串最终会找到我的 stob 函数。我这样做是为了解决另一个问题。我想我需要用不同的方式解决它。以上是关于“1”的 C++ 字符串与“1”不匹配(尝试了正则表达式和布尔值 '==')的主要内容,如果未能解决你的问题,请参考以下文章