[英]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.