web-dev-qa-db-fra.com

Différence entre <cstring> et <string>

Plus tôt dans la journée (en fait hier en raison de mon fuseau horaire), je tentais une interview de programmation en utilisant Visual Studio 2012 pour C++ sur Interview Street (qui utilise g ++).

Pour être bref, je suis tombé sur plusieurs erreurs de compilation1 quand j'utilisais

#include <cstring>

qui a été fourni par le code squelette dans l'une des questions, et après être passé à

#include <string>

toutes les erreurs de compilation ont disparu comme par magie.

Cependant, lors de la soumission à Interview Street, j'ai dû ajouter c en arrière; sinon j'ai des erreurs de compilation.

C'était la première fois que j'étais mordu par la non-normalisation ...

Ma question est: que contient <string> et <cstring> m'a pris (précieux) plus d'une demi-heure?


1 Pour toute personne curieuse:

Une erreur de Visual Studio 2012 si using <cstring> est:

erreur C2338: la norme C++ ne fournit pas de hachage pour ce type.

dans

c:\fichiers de programme (x86)\Microsoft visual studio 11.0\vc\include\xstddef

éventuellement pour string comme clé dans unordered_map

Une erreur par g ++ si using <string> est:

'strlen' n'a pas été déclaré dans ce domaine

47
Dante May Code

L'en-tête cstring fournit des fonctions pour traiter les chaînes de style C - des tableaux de caractères à terminaison nulle. Cela inclut des fonctions comme strlen et strcpy. C'est la version C++ du classique string.h en-tête de C.

L'en-tête string fournit le std::string classe et fonctions et opérateurs associés.

Les en-têtes ont des noms similaires, mais ils ne sont pas vraiment liés au-delà de cela. Ils couvrent des tâches distinctes.

43
Rob Kennedy

<cstring> a le code de chaîne C de l'en-tête C string.h. C++ a une convention selon laquelle les en-têtes C ont le même nom de base, à l'exception d'un c de début et sans _ .h. Tous les contenus sont disponibles sous std:: espace de noms.

<string> possède la bibliothèque standard std::string et fonctions associées

6
juanchopanza

En C++, vous n'utiliseriez pas #include <somefile.h>, mais plutôt #include <somefile>. Maintenant, C++ a ses classes de chaînes dans <string>, mais les fonctions de chaîne de caractères sont également disponibles, ce qui serait dans <string.h>. C++ utilise des fichiers c-include "traditionnels". Donc, <cstring> et <string>

http://www.cplusplus.com/reference/clibrary/cstring/

4
Rudolf Mühlbauer