为什么wcslen在argv[1]上计算1个额外字符?
why does wcslen count 1 extra character on argv[1]?
argv[1]
似乎比输入多返回1个字符。argv[2]
是正确的
#include <stdio.h>
int main(int argc, wchar_t *argv[])
{
printf("%d %dn",wcslen(argv[1]),wcslen(argv[2]) );
return 0;
}
我使用mingw32来编译。我用gcc myprog.c
编译。
为什么会这样?
main
期望参数类型为int
和char**
(或等价的char*[]
)。还有一个可选的第三个参数,它是环境字符串数组。
但是,大多数编译器对main
参数的类型安全是宽松的。它很高兴地允许您声明main
接受argc和argv的任何类型的参数(或不接受参数)。我认为这在很大程度上与C
的向后兼容性有关。由于将char*[]
类型隐式地强制转换为wchar_t*[]
,字符串将以完全不同的方式进行解释。
所以说你从预期的wcslen中得到的+1是不正确的。这在技术上是未定义的行为。
两个可能的修复:
简单的修复方法就是将第二个参数改为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标准草案n1570.pdf:
5.1.2.2.1程序启动1程序启动时调用的函数命名为main。实现没有为这个函数声明原型。它的返回类型为int,不带形参:
int main(void) { /* ... */ }
或带两个形参(此处称为argc和argv,但可以使用任何名称,因为它们对于声明它们的函数来说是局部的):
int main(int argc, char *argv[]) { /* ... */ }
或同等的;10)或以其他实现定义的方式。
因此,int可以用定义为int的类型定义名来替换,或者argv的类型可以写成char ** argv,以此类推。
这应该很容易理解。如果您的实现以wchar_t**
类型支持argv
,那么它将以实现定义的方式在您的实现上工作。如果你需要可移植性,不要依赖任何实现定义的东西。
此外,wcslen()
被声明为返回size_t
的值,您应该使用%zu
指令来打印该值,并且#include <wchar.h>
可能也是一个好主意。
我不认为这两个都导致了你的问题,但它们都导致了未定义的行为。
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 如何实现高效的算法来计算大型数据集的多个不同值?
- 计算两个代码块的时间复杂度
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 是否有一种标准方法来计算两个 asctime() 值之间的天数
- 如果代码包含多个复杂度循环,如何计算复杂度
- 计算两个迭代器之间的距离时"Vector Iterators Incompatible"
- 在C++中编程,将 3 个数字发送到一个函数,然后计算这 3 个数字的平均函数
- 是否允许三元运算符在C++中计算两个操作数?
- AVX2:计算 512 个浮点数组的点积
- 我们如何并行运行算法的 n 个实例并以有效的方式计算结果函数的平均值?
- 为什么 2 个双精度值之间的差值计算错误?
- 我的C++级数计算程序出了什么问题?被困了好几个星期
- 我在c++中遇到了一个奇怪的错误,其中一个计算2个小整数加法的语句溢出到一个长值中
- 术语的计算结果不是采用0个参数的函数
- 计算着色器Open GL ES的多个输入
- 错误 C2064:术语的计算结果不是采用 3 个参数的函数
- 如何计算大小为 1000 x 1000 的 2D 数组中 2 个元素之间的步幅?C++
- 在手臂氖中高效计算两个不同的数字
- 将多个计算放入使用基于迭代次数的变量的 for 循环中