qwn*_*qwn 1 c windows string wchar-t
所以我想在注册表中添加一个字符串,因为注册表字符串要写入NULL终止我的字符串在各个地方包含一个空字符.
这是我的字符串的样子.
char names[550] = "1DFA-3327-*\01DFA-3527-*\001DFA-E527-*\00951-1500-
我把它转换成whcar_t字符串就像这样.
wchar_t names_w[1000];
size_t charsConverted = 0;
mbstowcs_s(&charsConverted, names_w, names, SIZE);
RegSetValueEx(*pKeyHandle, valueName, 0, REG_MULTI_SZ, (LPBYTE)names_w, size);
Run Code Online (Sandbox Code Playgroud)
注册表项应该是
1DFA-3327-*
1DFA-3527-*
1DFA-E527-*
0951-1500-*
0951-0004-*
0951-160D-*
Run Code Online (Sandbox Code Playgroud)
但这是注册表项,
1DFA-3327-*
<a box here>DFA-3527-*
<a box here>DFA-E527-*
951-1500-*
951-0004-*
951-160D-*
Run Code Online (Sandbox Code Playgroud)
所以吃起来0的0951也吃了1在1DFA
我尝试过的:
1>我尝试将字符串更改为
char names[550] = "1DFA-3327-*\0\01DFA-3527-*\0\001DFA-E527-*\0\00951-1500-
^ ^ Two nulls
Run Code Online (Sandbox Code Playgroud)
2>我尝试了不同的转换.
for(int i; i < SIZE; i++)
names_w[i] = (wchar_t)names[i];
Run Code Online (Sandbox Code Playgroud)
问题出在你的字符串文字中.
char names[550] = "1DFA-3327-*\01DFA-3527-*\001DFA-E527-*\00951-1500-...\0";
^^ ^^^ ^^
Run Code Online (Sandbox Code Playgroud)
您可以以八进制表示法(\ ooo)或十六进制表示法(\ x hh)提供ASCII字符.在您的情况下,您提供八进制表示法,这将最多吃掉三个字符.你应该把你的字符串更改为
char names[550] = "1DFA-3327-*\0001DFA-3527-*\0001DFA-E527-*\0000951-1500-...\0";
Run Code Online (Sandbox Code Playgroud)
要么
char names[550] = "1DFA-3327-*\0" // put null byte at end of GUID
"1DFA-3527-*" "\0" // add null byte as extra literal
"1DFA-E527-*" "\0"
"0951-1500-...\0";
Run Code Online (Sandbox Code Playgroud)
这也使得更容易识别字符串中的GUID.
如果要使用十六进制表示法,请注意这些表示字符可能超过两个字节,因此您还需要使用文字串联.(请参阅如何将十六进制转义符正确添加到字符串文字中?)
char names[550] = "1DFA-3327-*\x00" // put null byte at end of GUID
"1DFA-3527-*" "\x00" // add null byte as extra literal
"1DFA-E527-*" "\x00"
"0951-1500-...\x00";
Run Code Online (Sandbox Code Playgroud)
BTW,有没有理由不直接存储宽字符串?
wchar_t names[550] = L"1DFA-3327-*\x001DFA-3527-*\x001DFA-E527-*\x000951-1500-...\0";
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
61 次 |
| 最近记录: |