如何在C ++中连接以下char
和TCHAR
变量?
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*'
答案 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