在C ++中连接不同类型的字符串

时间:2015-06-03 09:42:29

标签: c++ string char tchar

如何在C ++中连接以下charTCHAR变量?

TCHAR fileName[50];

TCHAR prefix[5] = "file_";
TCHAR ext[4] = ".csv";
char *id[10];
generateId(*id);

generateId(char *s)函数只生成一个随机字符串。 我需要fileName类似于file_randomIdGoesHere.csv

我已尝试strncat(fileName, prefix, 5);适用于所有TCHAR个变量但不适用于char *,因为它需要const char *,所以也许有更好的方式这样做,不确定如何将char *char **转换为const char *

有什么想法吗?

我在strncat(fileName, id, 10)时遇到的错误是error: cannot convert 'char**' to 'const char*'

4 个答案:

答案 0 :(得分:2)

您应该做的第一件事是,因为您使用的是 C ++ 而不是纯C,只需使用字符串类来表示字符串并在其中管理它们比原始C风格的字符数组更方便。

在Windows C ++编程环境中, CString 是一个非常方便的字符串类。
您可以使用其重载的operator+(或+=)以方便,健壮且简单的方式连接字符串。

如果您在char字符串中存储了一个id(作为ASCII字符串),正如您在问题代码中所示:

char id[10];  
generateId(id);

你可以先围绕它创建一个CString(如果你使用的是Unicode版本,这也将从char-string转换为TCHAR-string,特别是wchar_t-string,这是VS2005以来的默认版本):

const CString strId(id);

然后,您可以构建整个文件名字符串:

//
// Build file name using this format:
//
//    file_<generatedIdGoesHere>.csv
//
CString filename(_T("file_"));
filename += strId;
filename += _T(".csv");

作为替代方案,您也可以使用CString::Format方法,例如:

CString filename;
filename.Format(_T("file_%s.csv"), strId.GetString());

您可以简单地将CString的实例传递给Win32 API中的LPCTSTR参数,因为CString提供了对LPCTSTR的隐式转换(即const TCHAR*)。

要使用CString,您只需#include <atlstr.h>

答案 1 :(得分:2)

您看到的错误是因为您的id数组声明错误。您声明了一个指针数组而不是一个字符数组。应该更像这样:

char id[10];
generateId(id);

话虽如此,您还将基于char的字符串文字分配给TCHAR数组,这意味着您没有为Unicode编译项目,否则这样的分配将无法编译。因此,您也可以将TCHAR替换为char

char fileName[50] = {0};

char prefix[] = "file_";
char ext[] = ".csv";
char id[10] = {0};

generateId(id);

然后,您应该将strncat()更改为_snprintf()

_snprintf(filename, 49, "%s%s.cvs", prefix, id);

如果你真的想使用TCHAR,那么你需要将所有内容更改为TCHAR,并使用TEXT()宏来获取文字:

TCHAR fileName[50] = {0};

TCHAR prefix[] = TEXT("file_");
TCHAR ext[] = TEXT(".csv");
TCHAR id[10] = {0};

generateId(id);
__sntprintf(filename, 49, TEXT("%s%s.cvs"), prefix, id);

如果您无法将id更改为TCHAR,则必须执行运行时转换:

TCHAR fileName[50] = {0};

TCHAR prefix[] = TEXT("file_");
TCHAR ext[] = TEXT(".csv");
char id[10] = {0};

generateId(id);

#ifdef UNICODE
wchar_t id2[10] = {0};
MultiByteToWideChar(CP_ACP, 0, id, -1, id2, 10);
#else
char *id2 = id;
#endif

__sntprintf(filename, 49, TEXT("%s%s.cvs"), prefix, id2);

答案 2 :(得分:1)

首先,将char转换为TCHAR(参见How to convert char* to TCHAR[ ]?

然后,使用_tcscat()连接两个TCHAR字符串。

答案 3 :(得分:1)

如果您没有使用UNICODE字符表。比你的TCHAR相当于char。

TCHAR prefix[6] = "file_"; //don't forget to allocate space for null terminator '\0'
TCHAR ext[5] = ".csv"; // size is not 4, remember null terminator
char id[10] = "random"; // no need to use char* here

std::ostringstream oss;
oss << prefix << id << ext << std::endl;
std::cout << oss.str() << std::endl; // gives you file_random.csv as output