gpt4 book ai didi

c++ - 为什么 wcslen 在 argv[1] 上计算 1 个额外字符?

转载 作者:太空宇宙 更新时间:2023-11-04 03:58:18 25 4
gpt4 key购买 nike

argv[1] 似乎比输入的字符多返回 1 个字符。 argv[2] 是正确的。

#include <stdio.h>
int main(int argc, wchar_t *argv[])
{
printf("%d %d\n",wcslen(argv[1]),wcslen(argv[2]) );
return 0;
}

我正在使用 mingw32 进行编译。我用 gcc myprog.c 编译。

为什么会这样?

最佳答案

main 需要类型为 intchar** 的参数(或者 char*[] 是等效的).还有一个可选的第三个参数,它是环境字符串数组。

但现在的情况是,大多数编译器都对 main 的参数的类型安全性放宽了。它很乐意让你声明 main 接受你想要的 argc 和 argv 的任何类型的参数(或没有参数)。我认为这在很大程度上是为了向后兼容 C 才能做到这一点。由于将 char*[] 类型隐式转换为 wchar_t*[],字符串会以截然不同的方式进行解释。

因此,说您从 wcslen 获得的 +1 比预期的多是不正确的。这是技术上未定义的行为。

两个可能的修复:

简单的解决方法就是将第二个参数 delcare 为 char 字符串数组,而不是 wchar_t 字符串。

int main(int argc, char* argv[])

如果您的编译器是 Visual Studio,并且您希望传递 Unicode 参数,则解决方法是将程序的入口点声明为 wmain 而不是 main

int wmain(int argc, wchar_t* argv[])

上面的 wmain 修复肯定会用 mingw 编译,但我不确定链接器是否支持启用 wmain 作为程序入口点。试试看就知道了。

关于c++ - 为什么 wcslen 在 argv[1] 上计算 1 个额外字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14410585/

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