Конкатенация строк разных типов в 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().