std::basic_string<CharT,Traits,Allocator>::substr

Returns a substring [pos,pos + count). If the requested substring extends past the end of the string, i.e. the count is greater than size() - pos (e.g. if count == npos), the returned substring is [pos,size()).

# Declarations

basic_string substr( size_type pos = 0, size_type count = npos ) const;

(until C++23) (constexpr since C++20)

constexpr basic_string
substr( size_type pos = 0, size_type count = npos ) const&;

(since C++23)

constexpr basic_string substr( size_type pos = 0, size_type count = npos ) &&;

(since C++23)

# Parameters

# Return value

String containing the substring [pos,pos + count) or [pos,size()).

# Notes

The allocator of the returned string is default-constructed: the new allocator might not be a copy of get_allocator().

# Example

#include <iostream>
#include <string>
 
int main()
{
    std::string a = "0123456789abcdefghij";
 
    // count is npos, returns [pos, size())
    std::string sub1 = a.substr(10);
    std::cout << sub1 << '\n';
 
    // both pos and pos + count are within bounds, returns [pos, pos + count)
    std::string sub2 = a.substr(5, 3);
    std::cout << sub2 << '\n';
 
    // pos is within bounds, pos + count is not, returns [pos, size())
    std::string sub4 = a.substr(a.size() - 3, 50);
    // this is effectively equivalent to
    // std::string sub4 = a.substr(17, 3);
    // since a.size() == 20, pos == a.size() - 3 == 17, and a.size() - pos == 3
 
    std::cout << sub4 << '\n';
 
    try
    {
        // pos is out of bounds, throws
        std::string sub5 = a.substr(a.size() + 3, 50);
        std::cout << sub5 << '\n';
    }
    catch (const std::out_of_range& ex)
    {
        std::cout << ex.what() << '\n';
    }
}

# Defect reports

DRApplied toBehavior as publishedCorrect behavior
LWG 847C++98there was no exception safety guaranteeadded strong exception safety guarantee

# See also