【问题标题】:C++ windows how to convert 'unsigned int' to 'TCHAR *'?C ++ windows如何将'unsigned int'转换为'TCHAR *'?
【发布时间】:2013-05-07 16:45:58
【问题描述】:

我是 Windows 上的 C++ 新手。请告诉我如何将unsigned int 转换为TCHAR *

【问题讨论】:

  • 是否要将值转换为指针!? unsigned int 是绑定到值的变量,TCHAR* 是指向 TCHAR 的指针,可以对它们应用许多对话。
  • 请描述您需要的特定转换。将整数转换为字符串表示形式。十进制?十六进制?
  • 他正试图将一个数字打印成一个字符串。

标签: c++ windows int tchar


【解决方案1】:

通常的方法是使用swprintf 将宽字符打印到wchar_tTCHAR 通常定义为)。

要将数字打印到TCHAR,您应该使用@hvd 下面提到的_stprintf(一怒之下)。这样,如果定义了UNICODE,您将使用宽字符,如果未定义UNICODE,您将使用ASCII 字符。

int myInt = 400 ;
TCHAR buf[300] ; // where you put result
_stprintf( buf, TEXT( "Format string %d" ), myInt ) ;

【讨论】:

  • swprintf 的哪些重载在未定义 UNICODE 时接受 char *
  • 我不确定,但为什么您认为swprintf 可以正确地将wchar_t* 转换为TCHAR*
  • TCHAR 在定义 UNICODE 时定义为 wchar_t,否则为 Ascii char。查看您的Windows.h
  • @bobobobo 是的,所以当UNICODE 没有定义时,swprintf 的前两个参数的类型为(const) char *,你最多会得到一个编译器错误,一个编译器警告和崩溃最坏的运行时间。当UNICODE 未定义时,您应该调用sprintf,而不是swprintf。我现在无法确认,但根据文档,您应该使用_stprintf
  • @bobobobo 就像我说的,_stprintf(在<tchar.h> 中)接受TCHAR *s 转发到sprintfswprintf,这取决于是否定义了UNICODE。 (我现在已经实际测试过了,还有另外两个问题:你应该使用另一个将缓冲区大小作为额外安全参数的重载,TEXT 应该是_TEXT。)
【解决方案2】:

也许您想将unsigned int 转换为字符串。如果TCHAR 被定义为WCHAR,您可以使用std::to_wstring

unsigned int x = 123;

std::wstring s = std::to_wstring(x);

然后将s.c_str() 转换为TCHAR*

你也应该看看MultiByteToWideChar

【讨论】:

  • @bobobobo:这种方式比使用 printf 好 10 倍。 to_wstring 不能溢出它的缓冲区,因为缓冲区大小是自动调整的。
  • @BenVoigt 您可以随时使用*_s version of these functions
  • @bobobobo:这仍然不能使缓冲区大小正确,它只是确保如果缓冲区太短,它会失败,而不是创建缓冲区溢出漏洞。
【解决方案3】:

您可以设置 TCHAR* 指向的位置。 (可能是个坏主意……)

unsigned int ptr_loc = 0; // Obviously you need to change this.
TCHAR* mychar;
mychar = ptr_loc;

或者你可以设置指针指向的TCHAR的值。 (这可能是你想要的。虽然记住 TCHAR 可以是 unicode 或 ansi,所以整数的含义可能会改变。)

unsigned int char_int = 65;
TCHAR* mychar = new TCHAR;
*mychar = char_int; // Will set char to 'A' in unicode.

【讨论】:

  • 看起来他正在尝试创建一个宽字符串。
  • 是的。好吧,我只是在猜测。
【解决方案4】:

我可能为时已晚,但这个程序即使在 Visual Studio 中也可能会有所帮助

#include "stdafx.h"
#include <windows.h>
#include <tchar.h> 
#include <strsafe.h>

#pragma comment(lib, "User32.lib")

int _tmain(int argc, TCHAR *argv[])
{
    int num = 1234;
    TCHAR word[MAX_PATH];
    StringCchCopy(word, MAX_PATH, TEXT("0000"));
    for(int i = 3; i >= 0 ;i--)
    {
        word[i] = num%10 + '0';
        num /= 10;
    }
    _tprintf(TEXT("word is %s\n"), word);
    return 0;
}

【讨论】:

    【解决方案5】:
    TCHAR buf[5];
    memset(buf, 0, sizeof(buf));
    return _itot_s(num, buf, 10);
    

    See this MSDN Link

    【讨论】:

      猜你喜欢
      • 2013-02-02
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多