【问题标题】:How concatenate a char with TCHAR array?如何将 char 与 TCHAR 数组连接起来?
【发布时间】:2019-06-21 13:39:09
【问题描述】:

我想用一个目录名连接一个随机字符串,最终结果必须是这样的:

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);

【问题讨论】:

  • strchar 不是字符串或 char 数组。
  • 您只为 s 分配了 1 个字符。
  • 如何在单个char 中容纳十一个字符(十个随机字符加上终止符)?
  • 此外,"%s" 格式需要一个指向字符数组的第一个字符的指针,您传递单个 char 变量。 And 因为您使用的是wsprintf,所以字符串应该是宽字符字符串。总而言之,大量的undefined behavior 代码非常少。
  • Offtopic:在可用长度中不包含空终止符是很不寻常的,就像您所做的那样。更常见的是反过来,所以可以这样做:char str[X]; gen_r(str, sizeof(str)); - 照原样,需要这样做 gen_r(str, sizeof(str) - 1)...

标签: c++ visual-studio-2013 char concatenation tchar


【解决方案1】:

gen_random 应该得到至少有 11 个字符的 char 数组(10 表示大小 + 1 表示终止 null)。

应该是这样的:

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

另外,格式字符串应该是:"%s\\%hs",第一个是TCHAR*类型(如果UNICODE定义wchar_t*如果不是char*)第二个总是char*类型。

hs,hs

字符串。此值始终被解释为 LPSTR 类型,即使 当调用应用程序定义 Unicode 时。

look here

注意:在 Microsoft 文档中:

  • LPSTR = 总是char*
  • LPWSTR = 总是wchar_t*
  • LPTSTR = TCHAR*(如果定义了 UNICODE:wchar_t*,否则:char*

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 2013-01-24
    • 2016-09-23
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多