从 argv[1] 到 char * string 的转换有什么问题?
What is the issue in following conversion from argv[1] to char * string?
我对 C 和指针还很陌生。我正在尝试将命令行参数转换为 wchar_t *
。但不知何故,它没有给出正确的输出。我错过了什么?
void fun(){
std::setlocale(LC_ALL, "en_US.utf8");
std::wcout.imbue(std::locale("en_US.utf8"));
char* mbstr = "f:\mypath1\mypath2\mypath3";
wstring reposPath;
char *c_ReposPathString = (char*)mbstr;
size_t c_ReposPathStringSize= 0;
if(c_ReposPathString)
{
c_ReposPathStringSize = 2*(strlen(c_ReposPathString)+1);
}
wchar_t *w_ReposPathChar = new wchar_t[c_ReposPathStringSize];
if(w_ReposPathChar)
{
mbstowcs(w_ReposPathChar, c_ReposPathString, c_ReposPathStringSize);
}
reposPath = w_ReposPathChar;
printf("%s", (char *)reposPath.c_str());
free(w_ReposPathChar);
}
当我打印 w_path 的长度时,它显示 1。But argv[1]
有多个字符。
您不能简单地将 wchar_t
字符串重新转换为 char
字符串并期望它起作用,因为可能(将)有 很多 wchar_t
高字节为零的值(转换后将被视为终止符)。
所以,而不是:
printf("%s", (char *)reposPath.c_str());
在 f
之后看到一个 'false' 空终止符,只需打印 wchar_t
字符串即可:
printf("%ws", reposPath.c_str());
此外,您的 mbstr
声明中缺少 const
,应该是这样的:
const char* mbstr = "f:\mypath1\mypath2\mypath3";
并且您不需要为 wchar_t
缓冲区分配两倍数量的 char
,所以这就足够了:
if (c_ReposPathString)
{
c_ReposPathStringSize = strlen(c_ReposPathString) + 1; // Don't need "* 2"
}
随时要求进一步澄清and/or解释。
我对 C 和指针还很陌生。我正在尝试将命令行参数转换为 wchar_t *
。但不知何故,它没有给出正确的输出。我错过了什么?
void fun(){
std::setlocale(LC_ALL, "en_US.utf8");
std::wcout.imbue(std::locale("en_US.utf8"));
char* mbstr = "f:\mypath1\mypath2\mypath3";
wstring reposPath;
char *c_ReposPathString = (char*)mbstr;
size_t c_ReposPathStringSize= 0;
if(c_ReposPathString)
{
c_ReposPathStringSize = 2*(strlen(c_ReposPathString)+1);
}
wchar_t *w_ReposPathChar = new wchar_t[c_ReposPathStringSize];
if(w_ReposPathChar)
{
mbstowcs(w_ReposPathChar, c_ReposPathString, c_ReposPathStringSize);
}
reposPath = w_ReposPathChar;
printf("%s", (char *)reposPath.c_str());
free(w_ReposPathChar);
}
当我打印 w_path 的长度时,它显示 1。But argv[1]
有多个字符。
您不能简单地将 wchar_t
字符串重新转换为 char
字符串并期望它起作用,因为可能(将)有 很多 wchar_t
高字节为零的值(转换后将被视为终止符)。
所以,而不是:
printf("%s", (char *)reposPath.c_str());
在 f
之后看到一个 'false' 空终止符,只需打印 wchar_t
字符串即可:
printf("%ws", reposPath.c_str());
此外,您的 mbstr
声明中缺少 const
,应该是这样的:
const char* mbstr = "f:\mypath1\mypath2\mypath3";
并且您不需要为 wchar_t
缓冲区分配两倍数量的 char
,所以这就足够了:
if (c_ReposPathString)
{
c_ReposPathStringSize = strlen(c_ReposPathString) + 1; // Don't need "* 2"
}
随时要求进一步澄清and/or解释。