在Windows(Visual Studio C ++ 2010)中,我正在尝试执行简单的字符串复制。这是我的代码:
char * filename;
(...)
filename = (char *) malloc(wcslen(argv[(i + 1)]) + 1);
wcscpy((wchar_t *)filename, argv[i + 1]);
wprintf(L"Filename is: %s", filename);
如果我的argv [i + 1]大于14,程序会崩溃。如果它是14或更低,它运行正常。见下文。
C:\Visual Studio 2010\Projects\test\Release>test.exe -f 12345678901234 aa asas asas
First Argument argv[1] -f
Argc = 6
Filename is: 12345678901234
这里有什么问题?我错过了什么? 感谢。
答案 0 :(得分:6)
意识到wcslen()
返回字符串中的宽字符数,而不是它占用的字节数。并且malloc()
需要多个字节......
因此,您需要将宽字符的数字乘以宽字符的 size ,然后再将其传递给malloc()
:
filename = (char *) malloc( (wcslen(argv[(i + 1)]) + 1) * sizeof(wchar_t));
但是,然后,您将其版式转换为(char *)
。如果argv
被声明为char *argv[]
或char **argv
,那么wcslen()
无论如何都会使用错误的函数:您需要strlen()
。
答案 1 :(得分:3)
如果您使用的是C ++,那么可以使用C ++方式,即
转储
char * filename;
(...)
filename = (char *) malloc(wcslen(argv[(i + 1)]) + 1);
wcscpy((wchar_t *)filename, argv[i + 1]);
wprintf(L"Filename is: %s", filename);
并将其替换为
std::wstring filename = argv[i+1];
wcout << L"FIlename is: " << filename;
和main
被
wmain( int argc, wchar_t *argv[ ]);