Конкатенация строк разных типов в C++

Как я могу объединить следующее char а также TCHAR переменные в C++?

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*'

4 ответа

Ошибка, которую вы видите, потому что ваш 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);

Первое, что вы должны сделать, так как вы используете C++, а не чистый C, просто используйте строковый класс для представления своих строк и управления ими гораздо более удобным способом, чем необработанные массивы символов в стиле C.

В контексте программирования Windows C++, CString очень удобный строковый класс
Вы можете использовать его перегруженным operator+ (или же +=) объединять строки удобным, надежным и простым способом.

Если у вас есть идентификатор, хранящийся в строке символов (в виде строки ASCII), как показано в коде вашего вопроса:

char id[10];  
generateId(id);

вы можете сначала создать вокруг него CString (это также преобразует строку char в строку TCHAR, в частности, в строку wchar_t, если вы используете сборки Unicode, которые используются по умолчанию с 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 в параметры LPCTSTR в Win32 API, поскольку CString предлагает неявное преобразование в LPCTSTR (т.е. const TCHAR*).

Чтобы использовать CString, вы можете просто #include <atlstr.h>,

Если вы не используете таблицу символов 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

Во-первых, конвертируйте char в TCHAR (см. Как конвертировать char* в TCHAR []?)

Затем объедините две строки TCHAR с помощью _tcscat().

Другие вопросы по тегам