7
votes

Quelle structure de chaîne de caractères est utilisée? Cstring vs wstring

J'ai une application MFC en C ++ qui utilise STD :: String et STD :: Wstring et se jette fréquemment de l'une à l'autre, et beaucoup d'autres non-sens. J'ai besoin de tout standardiser à un format unique, alors je me demandais si je devais aller avec cstring ou std :: wstring.

Dans l'application, je devrai générer des cordes d'une table à cordes, travailler avec beaucoup de Les appels Windows nécessitant des pointeurs de TCHAR ou WCHAR_T constants, modifier des contrôles, et interagissent avec l'API d'un objet COM nécessitant BSTR. P>

J'ai aussi des vecteurs de cordes, alors y a donc un problème avec un vecteur de cstrings?

lequel est le meilleur? Quels sont les avantages et les inconvénients de chacun? P>

Exemples B> P>

BSTR à wstring p> xxx pré>

wstring to bstr p> xxx pre>

ressource à chaîne à wstring p> xxx pré>

getprofileString () renvoie une cssstring. P>

Integer to String Format: P>

wchar_t total[32];
swprintf_s(total, 32, L"%d", trk->getInt());
wstring tot(total);


2 commentaires

Dupliquer: stackoverflow.com/questions/485654/... Stackoverflow.com/Questtions/133364/...


N'était pas vraiment un duplicata - je voulais comparer les deux que j'ai donné mon cas particulier, qui avaient des avantages et des inconvénients pour les deux.


3 Réponses :


3
votes

std :: wstring serait beaucoup plus portable et bénéficierait de beaucoup de code prérogatoire existant dans STL et à Boost. CString irait probablement mieux avec Windows Api.

wchart_t: N'oubliez pas que vous pouvez obtenir les données de WSTRing à tout moment en utilisant la fonction Data (), vous obtenez donc le pointeur WCHAR_T indispensable de toute façon.

BSTR: Utilisez Sysallocstring pour sortir le BSTR d'un wstring.data ().

Quant à la dépendance de la plate-forme, rappelez-vous que vous pouvez utiliser std :: basic_string pour définir votre propre chaîne, en fonction de ce que vous voulez que la longueur d'un seul caractère soit.

J'irais pour Wstring tous les jours ...


2 commentaires

Mais avec Wstring, il est gênant de charger des ressources de chaîne par ID, ainsi que lorsque j'ai besoin d'obtenir des données dans un tampon LPC - je dois créer des tampons temporaires, obtenir les données, puis créer des wstrings d'eux.


Postez le code, et je le simplifierai;) - J'ai récemment dû travailler avec cela et avoir frustré par Cstrings aussi ...



11
votes

std :: basique_string <> (ou plutôt ses spécialisations) est horrible de travailler avec, c'est l'OMI une des lacunes majeures de la STL (et je dirais C ++ en général). Cela ne sait même pas des codages - C'mon, c'est en 2010. Être capable de définir la taille de votre personnage ne suffit pas, car il n'y a aucun moyen d'indiquer des caractères de taille variable dans une base_string <>. Maintenant, UTF-8 n'est pas agréable de travailler avec un CRString, mais ce n'est pas aussi mauvais que d'essayer de le faire avec basic_string. Bien que je suis d'accord avec l'esprit des affiches ci-dessus qu'une solution standard est meilleure que les alternatives, CSSTRing est (si votre projet utilise de toute façon MFC ou ATL) beaucoup plus agréable à travailler avec STD :: String / Wstring: conversions entre ANSI / Unicode (à travers Cstringa et Cstringw), BSTR, chargement à partir de la table à cordes, opérateurs de distribution à TCHAR (.C_STR ()? Vraiment?), ...

CSSTRING a également format (), qui, bien que non sûr et quelque peu laid, est pratique. Si vous préférez des bibliothèques de formatage sécurisées, vous serez mieux à partir de basic_string.

En outre, CSSTLING a des algorithmes en tant que fonctions membres dont vous aurez besoin de renforcer les utilitaires de chaîne pour faire sur basic_string tels que la garniture, Split, etc.

Les vecteurs de CString ne sont pas un problème.

garde contre un licenciement dogmatique de CCString sur la base de celui-ci étant uniquement Windows: Si vous l'utilisez dans une interface graphique Windows, l'application est de toute façon seulement. Cela étant dit, s'il y a une chance que votre code soit nécessaire pour être une plate-forme interrogatoire à l'avenir, vous allez être bloqué avec Basic_string <>.


1 commentaires

Les vecteurs de Cstring sont ok, mais vous pouvez également utiliser Cstringarray's.



9
votes

i personnellement ira avec cstring S dans ce cas, puisque vous indiquez que vous travaillez avec BSTR S, à l'aide de COM et d'écrire cela dans MFC. Alors que wstring S serait plus conforme aux normes, vous rencontrerez des problèmes avec une conversion constante de l'une à l'autre. Puisque vous travaillez avec COM et l'écrir dans MFC, il n'y a aucune raison réelle de s'inquiéter de la rendant la plate-forme inter-plate-forme, car aucun autre système d'exploitation n'a que Windows et MFC vous bloque déjà dans Windows.

Comme vous l'avez noté, cstring S a également des fonctions intégrées pour aider à charger les chaînes et convertir en BSTR S et similaire, tous pré-fabriqués et déjà conçus pour Travailler avec Windows. Donc, alors que vous devez normaliser sur un format, pourquoi ne pas faciliter le fonctionnement?


0 commentaires