Ole*_*siy 4 c++ string portability text-processing contains
我对其中一个问题的评论中有一个有趣的论点.我的对手声称声明""中没有包含""错误.
我的理由是,如果""包含另一个"",那个也包含"",依此类推.
谁错了?
PS
我在说一个 std::string
私人参建居屋
我不是在谈论子串,但即使我将我的问题"添加为子串",它仍然没有意义.空子字符串是无意义的.如果允许空字符串包含在字符串中,则意味着您具有无限的空子字符串.那是什么意思?
我是唯一认为这个功能有问题的人std::string::find吗?
C++参考清楚地说
返回值:第一个匹配的第一个字符的位置.
好吧,让我们假设一分钟有意义并运行此代码:
string empty1 = "";
string empty2 = "";
int postition = empty1.find(empty2);
cout << "found \"\" at index " << position << endl;
Run Code Online (Sandbox Code Playgroud)
输出是: found "" at index 0
无意义部分:如何在长度为0的字符串中存在索引0?这是无稽之谈.
为了能够甚至有一个零位置,该字符串必须至少为1个字符长.
在这种情况下C++给出了一个例外,这证明了我的观点:
cout << empty2.at( empty1.find(empty2) ) << endl;
Run Code Online (Sandbox Code Playgroud)
如果它真的包含一个空字符串,那么将其打印出来就没问题了.
mol*_*ilo 15
这取决于你所说的"包含".
空字符串是空字符串的子字符串,因此包含在那个意义上.
另一方面,如果将字符串视为字符集合,则空字符串不能包含空字符串,因为其元素是字符,而不是字符串.
关于集合,集合
{2}
Run Code Online (Sandbox Code Playgroud)
是集合的子集
A = {1, 2, 3}
Run Code Online (Sandbox Code Playgroud)
但{2}不是会员的A-所有A的成员是数字,而不是套.
以同样的方式,{}是一个子集{},但{}不是一个元素{}(它不能是因为它是空的).
所以你们都是对的.
C++同意你的"对手":
#include <iostream>
#include <string>
using namespace std;
int main()
{
bool contains = string("").find(string("")) != string::npos;
cout << "\"\" contains \"\": "
<< boolalpha << contains;
}
Run Code Online (Sandbox Code Playgroud)
输出: "" contains "": true
这很容易。如果存在offset这样的参数,则字符串 A 包含子字符串 B A.substr(offset, B.size()) == B。不需要空字符串的特殊情况。
那么,让我们看看。std::string("").substr(0,0)原来是std::string("")。我们甚至可以检查你的“反例”。std::string("").substr(0,0).substr(0,0)也是明确的和空的。海龟一路下来。