- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
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
需要类型为 int
和 char**
的参数(或者 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/
根据http://msdn.microsoft.com/en-us/library/78zh94ax%28v=vs.80%29.aspx , wcslen函数和其他类似函数存在缓冲区溢出问题带来的潜在
我一直在尝试使用 cpw 库来处理一些图形。我设置好了,但我似乎在编译时遇到了问题。 即,在字符串 header 中,它通过 提供对 unicode 的支持 #if defined(UNICODE)
此函数计算字符串开头和终止空字符之间的字符数。 size_t wcslen(const wchar_t* sz) { size_t l = 0; while (*sz++) ++l;
编译器:http://sourceforge.net/projects/mingwbuilds/files/ #include #include #include using namespace
在 C 中,我在执行时遇到段错误 const wchar_t *id = L"{{content}}\0"; wprintf(L"%s\n", wcslen(id)); 我不明白这里出了什么问题...
我发现 wcslen()在 VC++2010 中返回正确的字母数;同时 Xcode 没有。 例如,下面的代码在 VC++ 2010 中返回正确的 11,但在 Xcode 4.2 中返回不正确的 17。
我发现当源是 wchar_t 数组(压缩结构的成员)时,wcslen() 在 gcc 上返回不正确的结果(在 msvc 上是正确的)。我知道在 linux 上 sizeof(wchar_t) == 4
源代码: const wchar_t* x = L"abc"; printf("%d\n",wcslen(x)); 我用 g++ -fshort-wchar xxx.cpp -o xxx 编译了它
argv[1] 似乎比输入的字符多返回 1 个字符。 argv[2] 是正确的。 #include int main(int argc, wchar_t *argv[]) { printf("%
从“wcslen”替换为“strnlen_s”时,使用const char* 进行类型转换是否正确? 在下面的函数中我正在替换 if (szPath[wcslen(szPath) - 1] != L'
在 Windows 下将 C++ 程序从 32 位移植到 64 位时,我意识到不支持 _tcslen,而是应该使用 strlen/wcslen(对于非 unicode/unicode)。我开始怀疑 如
有一个 strlen 和一个 wcslen 函数,但是有一个模板字符数组长度函数,所以你可以做一些类似 strlen 的事情或 strlen ? 如果没有,那我想我会自己写。 最佳答案 你有 std:
我是一名优秀的程序员,十分优秀!