簡體   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