38

In Python, I was able to slice part of a string; in other words just print the characters after a certain position. Is there an equivalent to this in C++?

Python code:

text = "Apple Pear Orange"
print text[6:]

Would print: Pear Orange

0

7 Answers 7

49

Yes, it is the substr method:

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

Returns a substring [pos, pos+count). If the requested substring extends past the end of the string, or if count == npos, the returned substring is [pos, size()).

Example

#include <iostream>
#include <string>

int main(void) {
    std::string text("Apple Pear Orange");
    std::cout << text.substr(6) << std::endl;
    return 0;
}

See it run


If you can use C++17, use a string_view to avoid a copy:

std::string_view(text).substr(6)

If you can use C++20, now we have ranges. See other answers for more information.

Sign up to request clarification or add additional context in comments.

Comments

18

In C++, the closest equivalent would probably be string::substr().

Example:

std::string str = "Something";
printf("%s", str.substr(4)); // -> "thing"
printf("%s", str.substr(4, 3)); // -> "thi"

The first parameter is the initial position, and the second is the length sliced.

The second parameter defaults to the end of the string (string::npos).

Comments

10

It looks like C++20 will have Ranges which are designed to provide, amongst other things, Python-like slicing.

So I'm waiting for it to land in my favorite compiler, and meanwhile use Range-v3.

Comments

7

Use:

std::string text = "Apple Pear Orange";
std::cout << std::string(text.begin() + 6, text.end()) << std::endl;  // No range checking at all.
std::cout << text.substr(6) << std::endl; // Throws an exception if string isn't long enough.

Note that, unlike Python, the first doesn't do range checking: Your input string needs to be long enough. Depending on your end-use for the slice, there may be other alternatives as well (such as using an iterator range directly instead of making a copy like I do here).

Comments

6

It sounds like you want string::substr:

std::string text = "Apple Pear Orange";
std::cout << text.substr(6, std::string::npos) << std::endl; // "Pear Orange"

Here string::npos is synonymous with "until the end of the string" (and is also default, but I included it for clarity).

Comments

2

You can do something like this using the string class:

std::string text = "Apple Pear Orange";
size_t pos = text.find('Pear');

Comments

0

The first parameter determines the starting index and the second parameter specifies the ending index. Remember that the starting of a string is from 0.

string s = "Apple";

string ans = s.substr(2); // Result: "ple"

string ans1 = s.substr(2, 3) // Result: "pl"

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.