Как соединить char с массивом TCHAR?

Я хочу объединить случайную строку с именем каталога, и конечный результат должен быть примерно таким:

C:\Program Files (x86)\AAAFFF1334

В следующем коде эта часть: "AAAFFF1334" содержит странные символы:

введите здесь описание изображения

Что нужно сделать, чтобы это исправить?

TCHAR mydir[MAX_PATH];

void gen_random(char *s, const int len) {
    static const char alphanum[] =
        "0123456789"
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        "abcdefghijklmnopqrstuvwxyz";

    for (int i = 0; i < len; ++i) {
        s[i] = alphanum[rand() % (sizeof(alphanum)-1)];
    }

    s[len] = 0;
}

// main

TCHAR szProgramFiles[MAX_PATH];
HRESULT hProgramFiles = SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, SHGFP_TYPE_CURRENT, szProgramFiles);

char str;

gen_random(&str, 10);

wsprintf(mydir, TEXT("%s\\%s"), szProgramFiles, str);

person Community    schedule 28.01.2019    source источник
comment
str является char не строкой или char массивом.   -  person SHR    schedule 28.01.2019
comment
Вы выделяете только 1 символ для s.   -  person stark    schedule 28.01.2019
comment
Как уместить одиннадцать символов (десять случайных плюс терминатор) в один char?   -  person Some programmer dude    schedule 28.01.2019
comment
Кроме того, формат "%s" ожидает указатель на первый символ массива символов, вы передаете единственную переменную char. И поскольку вы используете wsprintf, строки должны быть широкими символами. В общем, много неопределенного поведения в очень небольшом коде.   -  person Some programmer dude    schedule 28.01.2019
comment
Offtopic: довольно необычно не включать нулевой терминатор в доступную длину, как это делаете вы. Чаще наоборот, поэтому можно было бы сделать: char str[X]; gen_r(str, sizeof(str)); - как есть, нужно было бы сделать gen_r(str, sizeof(str) - 1)...   -  person Aconcagua    schedule 28.01.2019


Ответы (1)


gen_random должен получить массив символов, содержащий не менее 11 символов (10 для размера + 1 для завершающего нуля).

Так должно быть:

char str[10+1]; //or char str[11];
gen_random(str, 10);

кроме того, строка формата должна быть: "%s\\%hs", первая - TCHAR* типа (если UNICODE определено wchar_t*, если не char*), вторая всегда char* типа.

hs, hS

Нить. Это значение всегда интерпретируется как тип LPSTR, даже если вызывающее приложение определяет Unicode.

смотрите здесь

Примечание: в документации Microsoft:

  • LPSTR = всегда char*
  • LPWSTR = всегда wchar_t*
  • LPTSTR = TCHAR* (если определен UNICODE: wchar_t*, иначе: char*)
person SHR    schedule 28.01.2019