60

How come this code

std::map <std::string , int> m;
m["a"]=1;

compiles with (I'm using MSVC 2010)

#include <string>

but not with

#include <string.h>

?

iammilind
  • 65,167
  • 30
  • 162
  • 315
Valmond
  • 2,750
  • 8
  • 27
  • 48

10 Answers10

93
  • <string.h> contains old functions like strcpy, strlen for C style null-terminated strings.
  • <string> primarily contains the std::string, std::wstring and other classes.
Ajay
  • 17,472
  • 10
  • 53
  • 96
  • 38
    It should also be noted that using `string.h` is deprecated within C++. If you need the functionality contained within, you should use the header `cstring`. This more or less completely bypasses the issue of "What's the difference between these two" because it's very obvious that one is from the C library. – Mike Bailey Mar 11 '12 at 20:53
21

string.h is a C header not a C++ header, period!

Prasoon Saurav
  • 88,492
  • 46
  • 234
  • 343
  • Do you mean that when I do a couple of files .h/.cpp I should remove the .h or is your answer just for euh, like sdk files? – Valmond Feb 13 '12 at 09:05
  • 18
    I think, it's better to say the other way: ` is C++ header, not a C header.` – iammilind Feb 13 '12 at 09:06
16

<string.h> is cstring - http://www.cplusplus.com/reference/clibrary/cstring/

<string> is the c++ string class - http://www.cplusplus.com/reference/string/

Edit per Nicol Bolas comment below and a bit of googling:

<cstring> will usually import the same things as <string.h> but into the std namespace. <string.h> will usually import everything into the global namespace. It appears to depend on the library implementation you're using though according to my googling.

Personally I only ever use <cstring> if I need C style string helpers.

matiu
  • 6,995
  • 4
  • 41
  • 46
12

string.h is C's header file while string is C++'s header file.

Abhijeet Rastogi
  • 15,731
  • 26
  • 75
  • 125
9

<string.h> contains C-library string functions. strlen, strcmp, etc.

<string> contains the definition for std::basic_string, which has the typedefs std::string and std::wstring. That's the difference.

They really have no relationship at all, outside of the fact that they both deal with strings.

Nicol Bolas
  • 413,367
  • 61
  • 711
  • 904
5

They are entirely different headers.

<string> is C++ string class

<string.h> or <cstring> defines functions to manipulate C strings and arrays

Sanish Gopalakrishnan
  • 1,649
  • 1
  • 12
  • 21
3

As stated, string.h and cstring are C headers (while cstring is basically a C++ wrapper for string.h), containing functions for C strings, which are char[] terminated by '\0'. You want to use the c++ class string, which header is <string>.

Zeta
  • 100,191
  • 13
  • 186
  • 227
2

I believe <string.h> is just used for C and <string> for C++. So including string.h wont work.

Zeta
  • 100,191
  • 13
  • 186
  • 227
jpstrube
  • 775
  • 1
  • 13
  • 27
0

<string.h> is a C standard library header while <string> is a cpp in fact all the c standard header files have .h extension an non of cpp have .h.

0

string.h is for c compatible c++ string class string is for pure c++ string class