[英]Concatenating strings of different types in C++
如何在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*'
是error: cannot convert 'char**' to 'const char*'
您应该做的第一件事是,由于您使用的是C ++,而不是纯C,因此只需使用字符串类来表示您的字符串,并以比原始C样式字符数组方便得多的方式管理它们。
在Windows C ++编程的上下文中, CString
是一个非常方便的字符串类。
您可以使用其重载的operator+
(或+=
)以方便,健壮和简单的方式连接字符串。
如果您将ID存储在char字符串(作为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());
您只需在Win32 API中将CString的实例传递给LPCTSTR参数,因为CString提供了对LPCTSTR的隐式转换(即const TCHAR*
)。
要使用CString,您只需#include <atlstr.h>
。
您看到的错误是因为id
数组被声明为错误。 您声明了一个指针数组,而不是一个字符数组。 应该更像这样:
char id[10];
generateId(id);
话虽这么说,您还向TCHAR
数组分配了基于char
的字符串文字,这意味着您没有针对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);
首先,将char转换为TCHAR(请参阅如何将char *转换为TCHAR []? )
然后,使用_tcscat()连接两个TCHAR字符串。
如果您不使用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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.