36

For example, if I have

string x = "dog:cat"; 

and I want to extract everything after the ":", and return cat. What would be the way to go about doing this?

3
  • 1
    See the example here: cplusplus.com/reference/string/string/substr Commented Jan 27, 2015 at 5:24
  • This question could have been avoided with a bit of research. Commented Jan 27, 2015 at 5:41
  • 10
    Maybe so, but it's top of Google results now. Commented Mar 31, 2017 at 14:04

9 Answers 9

88

Try this:

x.substr(x.find(":") + 1); 
Sign up to request clarification or add additional context in comments.

5 Comments

This is amazing !! <3
This creates a copy, which may not be what you want. In C++17 you can use std::string_view to avoid copying.
As mentioned in some of the other answers, you should handle the edge case of find returning npos. It is not guaranteed that npos + 1 equals 0 (see stackoverflow.com/questions/26402961/…).
What if I had "cat:dog:parrot:horse" and I want to get just horse? (So the last one :)
@rcs How should I do exactly same thing in C programming?
15

I know it will be super late but I am not able to comment accepted answer. If you are using only a single character in find function use '' instead of "". As Clang-Tidy says The character literal overload is more efficient.

So x.substr(x.find(':') + 1)

Comments

12

The accepted answer from rcs can be improved. Don't have rep so I can't comment on the answer.

std::string x = "dog:cat"; std::string substr; auto npos = x.find(":"); if (npos != std::string::npos) substr = x.substr(npos + 1); if (!substr.empty()) ; // Found substring; 

Not performing proper error checking trips up lots of programmers. The string has the sentinel the OP is interested but throws std::out_of_range if pos > size().

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

Comments

5
#include <iostream> #include <string> int main(){ std::string x = "dog:cat"; //prints cat std::cout << x.substr(x.find(":") + 1) << '\n'; } 

Here is an implementation wrapped in a function that will work on a delimiter of any length:

#include <iostream> #include <string> std::string get_right_of_delim(std::string const& str, std::string const& delim){ return str.substr(str.find(delim) + delim.size()); } int main(){ //prints cat std::cout << get_right_of_delim("dog::cat","::") << '\n'; } 

1 Comment

Thinking of delims of any length is simply smart, so a +1
2

something like this:

string x = "dog:cat"; int i = x.find_first_of(":"); string cat = x.substr(i+1); 

Comments

1

Try this:

 string x="dog:cat"; int pos = x.find(":"); string sub = x.substr (pos+1); cout << sub; 

Comments

1

What you can do is get the position of ':' from your string, then retrieve everything after that position using substring.

size_t pos = x.find(":"); // position of ":" in str

string str3 = str.substr (pos);

Comments

1
#include <string> #include <iostream> std::string process(std::string const& s) { std::string::size_type pos = s.find(':'); if (pos!= std::string::npos) { return s.substr(pos+1,s.length()); } else { return s; } } int main() { std::string s = process("dog:cat"); std::cout << s; } 

1 Comment

I have executed this code it works ..tutorialspoint.com/compile_cpp_online.php
0

Try this one..

std::stringstream x("dog:cat"); std::string segment; std::vector<std::string> seglist; while(std::getline(x, segment, ':')) { seglist.push_back(segment); } 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.