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
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()).
#include <iostream>
#include <string>
int main(void) {
std::string text("Apple Pear Orange");
std::cout << text.substr(6) << std::endl;
return 0;
}
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.
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).
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.
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).
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).