为什么substr会产生不同的结果?

时间:2014-07-17 17:35:08

标签: c++ substr

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)? 由于我需要生成所有唯一的子串,这非常令人困惑

4 个答案:

答案 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)会根据您的要求返回空字符串。