【问题标题】:How to print wchar_t variables in C如何在 C 中打印 wchar_t 变量
【发布时间】:2020-01-24 04:43:22
【问题描述】:

我正在调试我们公司编写的一些旧 C 代码。函数是这样的--

uint32
ExecuteCommand(wchar_t *dnsName,           // IN
                                wchar_t *dnsUser,   // IN
                                PNameValue *nameValues, // OUT
                                size_t *valuesSize)     // OUT
{
   ....

为了调试它,我需要检查传递给这个函数的 dnsUser 和 dnsName 的值。我尝试了以下选项 -

    Util_Log(L"Printing the userName %S", dnsUser);
    Util_Log(L"Printing the userName ", dnsUser);
    Util_Log(L"Printing the userName %ls", dnsUser);
    Util_Log(L"Printing the userName %lS",dnsUser);

Util_Log 是我们公司使用的专有日志记录 API。但是,以上都不起作用,并且用户名在生成的日志中以某种乱码形式打印出来。我尝试使用 printf 和 wprintf 但没有在日志中打印任何内容--

  printf("Printing the userName %S",userName);
  wprintf("Printing the userName %lS  %S", userName);

补充一下:下面是 SimCfg_Log API 的签名。

void
Util_Log(const wchar_t *fmt,  // IN
         ...)                   // IN 

在方法中打印 wchar_t 参数的正确方法是什么?另外,知道为什么使用 printf 和 wprintf 不会在日志中打印任何内容吗?

【问题讨论】:

  • 你用你的调试器检查了dnsUser中的内容吗?
  • 是的,当我签入调试器时,dnsUser 是一些有效名称,例如 John、David 等,而不是乱码

标签: c char wchar-t wchar


【解决方案1】:

我的精神力量表明这就是你需要做的一切:

Util_Log(L"Printing the userName %s", dnsUser);

我的精神力量有两个提示:

第一个提示是 Util_Log 的第一个参数是宽字符 (L"") 字符串。因此,格式说明符%s, 也将被解释为宽字符字符串。

第二个提示是他只是你没有提到已经尝试过的格式说明符。 ;)

【讨论】:

  • 感谢您的 cmets,但它没有用,仅供参考,该方法的签名是这个,-void Util_Log(const wchar_t *fmt, // IN ...) ,所以我认为它应该工作
  • 这就是精神力量的问题,它们有时会让你失望。显然,您团队中的任何人都建议您咨询公司内Util_Log API 的所有者或自己检查源代码。您是说您无权访问任何一个并且必须与预编译的库链接?否则,您最后的手段是按照 Mathieu 下面的建议进行操作。 swprintf 到临时缓冲区。然后将其传递给您的日志记录功能。
【解决方案2】:

您无法使用内部函数的格式化选项并依赖swprintf

#define SIZE 256
wchar_t buffer[SIZE];
swprintf(buffer, SIZE, L"Printing the userName %s",userName);

Util_Log(buffer);

【讨论】:

  • 由于 OP 表明我的建议不起作用,我赞成这个答案。我对 OP 的建议是注意字符串长度(使用 snprintf)以及当 userName 本身具有 %s 转义序列时。我不希望你的日志声明成为一个安全漏洞。
猜你喜欢
  • 2021-10-28
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2013-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多