string s;
cin >> s;
cout << s.substr(0, 0) << endl; // ""
cout << s.substr(0, 1) << endl; // a
cout << s.substr(1, 1) << endl; // b
cout << s.substr(2, 2) << endl; // c
cout << s.substr(1, 2) << endl; // bc
cout << s.substr(0, 2) << endl; // ab
在这段代码中,为什么(0, 1)
会产生一个而不是(0, 0)
?
由于我需要生成所有唯一的子串,这非常令人困惑
答案 0 :(得分:6)
substr
的签名是:
substr(startingPosition, length)
所以当你打电话给substr(0,0)
时,你从第一个位置开始并取零字符。字符为零的字符串是空字符串而不是“a”。
答案 1 :(得分:1)
其他答案清楚substr()
如何运作。
您还提到要生成所有唯一的子字符串。一种简单的方法是将所有子串放在std::set
。
#include <string>
#include <set>
#include <iostream>
int main() {
std::string s = "abcbc";
std::set<std::string> substrings;
for (int start = 0; start < s.size(); ++start)
for (int length = 0; length <= s.size() - start; ++length)
substrings.insert(s.substr(start, length));
for (std::string const & substring : substrings)
std::cout << substring << "\n";
}
哪个输出:
[12:43pm][wlynch@watermelon /tmp] ./sub
a
ab
abc
abcb
abcbc
b
bc
bcb
bcbc
c
cb
cbc
答案 2 :(得分:0)
通过传递0
作为第二个参数,您试图在长度为0
的字符串中找到一个子字符串,并期望获得一些非空的子字符串。
答案 3 :(得分:0)
在这段代码中,为什么(0,1)产生但不是(0,0)?
因为它假设这样做。第二个参数是子串长度,而不是位置。所以s.substr(0,0)
会根据您的要求返回空字符串。