35

I have following code that gets and prints a string.

#include<iostream> #include<conio.h> #include<string> using namespace std; int main() { string str; cout << "Enter a string: "; getline(cin, str); cout << str; getch(); return 0; } 

But how to count the number of characters in this string using strlen() function?

12
  • 2
    How about str.size()? Commented Nov 24, 2013 at 20:56
  • main must return int. Commented Nov 24, 2013 at 20:56
  • Why strlen exactly? Commented Nov 24, 2013 at 20:57
  • So we cant count character in a string using strlen() function? Commented Nov 24, 2013 at 20:57
  • 9
    Title? Author? It was apparently written by someone who doesn't know the language very well, and it may contain more serious mistakes. I'd like to warn people away from it. Commented Nov 24, 2013 at 21:15

7 Answers 7

101

For C++ strings, there's no reason to use strlen. Just use string::length:

std::cout << str.length() << std::endl; 

You should strongly prefer this to strlen(str.c_str()) for the following reasons:

  1. Clarity: The length() (or size()) member functions unambiguously give back the length of the string. While it's possible to figure out what strlen(str.c_str()) does, it forces the reader to pause for a bit.

  2. Efficiency: length() and size() run in time O(1), while strlen(str.c_str()) will take Θ(n) time to find the end of the string.

  3. Style: It's good to prefer the C++ versions of functions to the C versions unless there's a specific reason to do so otherwise. This is why, for example, it's usually considered better to use std::sort over qsort or std::lower_bound over bsearch, unless some other factors come into play that would affect performance.

The only reason I could think of where strlen would be useful is if you had a C++-style string that had embedded null characters and you wanted to determine how many characters appeared before the first of them. (That's one way in which strlen differs from string::length; the former stops at a null terminator, and the latter counts all the characters in the string). But if that's the case, just use string::find:

size_t index = str.find(0); if (index == str::npos) index = str.length(); std::cout << index << std::endl; 
Sign up to request clarification or add additional context in comments.

10 Comments

@AkashSharma- You can use strlen on a C++ string by writing strlen(str.c_str()), but this would be extremely poor style. Although C++ absorbs C's standard library, the C++ standard libraries often include more C++-friendly versions of those functions, and there's no reason to use strlen when you could just be using string::length.
@AkashSharma- strlen accepts const char*, and std::string isn't a const char*. That said - it is really not a good idea to use strlen here!
@AkashSharma- I believe it's historical. The STL contains use size(), and I think historically string used length(). It's probably for backwards compatibility.
@Xlea You probably mean str[4] = '\0'?
@zenith Right, I do.
|
7

Function strlen shows the number of character before \0 and using it for std::string may report wrong length.

strlen(str.c_str()); // It may return wrong length. 

In C++, a string can contain \0 within the characters but C-style-zero-terminated strings can not but at the end. If the std::string has a \0 before the last character then strlen reports a length less than the actual length.

Try to use .length() or .size(), I prefer second one since another standard containers have it.

str.size() 

3 Comments

.size was correct, too. I actually use it instead of length.
Why two functions size() and length() are given in C++ ? Any specific reason? Because Both are doing same work.
@AkashSharma You can check it here: size and length
2

Use std::string::size or std::string::length (both are the same).

As you insist to use strlen, you can:

int size = strlen( str.c_str() ); 

note the usage of std::string::c_str, which returns const char*.

BUT strlen counts untill it hit \0 char and std::string can store such chars. In other words, strlen could sometimes lie for the size.

4 Comments

c_str()documentation from cppreference: Returns a pointer to a null-terminated character array with data equivalent to those stored in the string.
@Johan: Not necessarily. A std::string can contain embedded null characters. If you have a std::string foo with the value "foo\0bar", it's .length() is 7, but strlen(foo.c_str()) will return 3.
My mistake, I read your message the other way (that there was no '\0' at the end).
Sorry I removed my previous comment that was becaming meaningless.
1

If you really, really want to use strlen(), then

cout << strlen(str.c_str()) << endl; 

else the use of .length() is more in keeping with C++.

Comments

0

Manually:

int strlen(string s) { int len = 0; while (s[len]) len++; return len; } 

1 Comment

Are you serious or being sarcastic? :)
0
#include<iostream> #include<conio.h> #include<string.h> using namespace std; int main() { char str[80]; int i; cout<<"\n enter string:"; cin.getline(str,80); int n=strlen(str); cout<<"\n lenght is:"<<n; getch(); return 0; } 

This is the program if you want to use strlen . Hope this helps!

Comments

-2

Simply use

int len=str.length();

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.