d的toUTF16
原文
我尝试使用wcsncat()
import std.stdio;
@system void main(){
import std.utf : toUTF16z, toUTF16;
import core.stdc.wchar_ : wcsncat, wcslen, wprintf;
import core.stdc.stdlib : wchar_t;
import core.sys.windows.winnt : LPCWSTR;
wchar_t* clang_string = cast(wchar_t *)"AAAAAAAAAA";
string dlang_string = "BBBBBBBBBBB";
LPCWSTR winpointer_to_string = "CCCCCCCCCC";
wcsncat(clang_string, dlang_string.toUTF16z, wcslen(dlang_string.toUTF16z));
// 输出: AAAAAAAAAABBBBBBBBBBB
wcsncat(clang_string, winpointer_to_string, wcslen(winpointer_to_string));
//输出:AAAAAAAAAABBBBBBBBBBBBBBBBBBBB
//期望:AAAAAAAAAABBBBBBBBBBBCCCCCCCCCC
wprintf(clang_string);
//输出:AAAAAAAAAABBBBBBBBBBBBBBBBBBBB
//期望:AAAAAAAAAABBBBBBBBBBBCCCCCCCCCC
}
这是未定义的行为."AAAAAAAAAA"是串字面,存储在数据段中.仅仅强制转换为wchar_t*并不能使通过指针写入合法.而且,即使这样写是合法的,还不够.从文档wcsncat:
如果目标数组对于str和dest的内容及终止空宽字符都不够大,则行为未定义.
wcsncat不分配内存,它希望你提供足够大的可变缓冲区.例如,像这样:
auto cls = new wchar_t[256];
cls[] = 0;
cls[0..10] = 'A';
wchar_t* clang_string = cls.ptr;
是的,这样就行了.
浙公网安备 33010602011771号