2011-04-05 4 views
2

Quelle est la meilleure façon de concaténer?Const char * vs const wchar_t * (concaténation)

const char * s1= "\nInit() failed: "; 
const char * s2 = "\n"; 
char buf[100]; 
strcpy(buf, s1); 
strcat(buf, initError); 
strcat(buf, s2); 
wprintf(buf); 

Il donne une erreur. Quel devrait être le bon chemin?

Merci.

+2

Qu'est-ce que initError? De plus, vous devez utiliser printf si vous traitez avec char. Est-ce que initError du type wchar_t? –

+0

Cherchez-vous 'wcstombs'? – Erik

+0

initError est également de type const char * – Azodious

Répondre

2

Je pense que la manière correcte est:

std::string msg = std::string("Init() Failed ") + initError + "\n"; 
std::cout<<msg; 

ou

std::cout<<"Init() Failed "<<initError<<"\n"; 
+0

mais si j'utilise wprintf ou fwprintf avec msg, cela ne fonctionnera pas. – Azodious

+0

@Azodious - std :: wcout fonctionnerait! –

+0

@Azodious: Si vous voulez utiliser les fonctions c, utilisez 'msg.c_str()'. – Xeo

1

Votre problème est que vous mélangez les types de données. Utilisez soit char et les fonctions associées, soit wchar et les fonctions associées. Si vous avez besoin de les mélanger, utilisez une fonction de conversion. Cela n'a pas plus de sens que d'essayer de passer un flottant à une fonction nécessitant une chaîne. (Le compilateur devrait être en mesure d'attraper les deux problèmes, depuis la déclaration de wprintf est quelque chose comme int wprintf(const wchar_t *, ...).)

Une autre, plus petit, problème est que printf et ce ne sont pas les bonnes fonctions pour imprimer les chaînes générales, car si il y a des signes de pourcentage dans les chaînes, vous aurez un comportement indéfini. Utilisez printf("%s",...) ou puts(...) ou des fonctions connexes. Et, puisqu'il s'agit de C++, il serait préférable d'utiliser la classe std::string. Ce n'est pas parfait, mais c'est beaucoup mieux que les cordes de style C. En outre, en nous disant ce que l'erreur est serait aiderait. Vous ne nous avez même pas dit s'il s'agissait d'une erreur de compilation ou d'une erreur d'exécution.