gpt4 book ai didi

c++ - 从argv [1]转换为char * string后,出现什么问题?

转载 作者:行者123 更新时间:2023-12-02 10:37:18 25 4
gpt4 key购买 nike

我对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之后看到一个“假” nul终止符,只需打印 wchar_t字符串即可:

printf("%ws", reposPath.c_str());

另外,您在 const的声明中缺少 mbstr,应该是这样的:

const char* mbstr = "f:\\mypath1\\mypath2\\mypath3";

而且您不需要为 char缓冲区分配两倍数量的 wchar_t,因此就足够了:

    if (c_ReposPathString)
{
c_ReposPathStringSize = strlen(c_ReposPathString) + 1; // Don't need "* 2"
}

随时要求进一步的澄清和/或解释。

关于c++ - 从argv [1]转换为char * string后,出现什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59658140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com