繁体   English   中英

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

[英]Concatenating strings of different types in C++

如何在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*'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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM