标题:C++求助 字符串遇到 0x00(二)
取消只看楼主
rosemaryzed
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2020-7-7
结帖率:100%
已结贴  问题点数:20 回复次数:9 
C++求助 字符串遇到 0x00(二)
https://bbs.bccn.net/viewthread.php?tid=502521&page=1#pid2732833
上次的问题在rjsp版的帮助下解决了,rjsp版果然厉害。
这次遇到一个新的问题,需要各位朋友的帮助,本人C++用的不多,学艺不精。
===========
拿到一个LPVOID* 指针,测试过发现指针的类型是wchar_t*。而且里面有数值。(数组中有非常多的0x00)。

我需要获取wchar_t*的数组长度。问题跟上一个贴一摸一样。上一次是用sizeof(char *)解决的。
这一次sizeof(wchar_t*)就算不出来了,请求指教。

如果用strlen(wcslen(wchar_t*))计算字符串长度,那么遇到0x00就退出。
wchar_t* p_t = _T("129099\0\0xxaa");
std::cout << wcslen(p_t);
std::cout << "\n";
std::cout << sizeof(p_t);
std::cout << "\n";
std::cout << sizeof(*p_t);
std::cout << "\n";
std::cout << sizeof(&p_t);

百度搜索了很多结果 有用while循环的。结果也是一样。跟wcslen一模一样,0x00忽略掉。
int arrayVlenth(_TCHAR* p)
{
    int len = 0;
    while (*p)
    {
        p++;
        len++;
    }
    return len;
}
int arrayLNlenth( _TCHAR** p)
{
    int len = 0;
    //while (**p)      //提示:0xC0000005: 读取位置 0xCDCDCDCD 时发生访问冲突。
    while (**p)          //**p是值
    {
        p++;
        len++;
    }
    return len;
}
搜索更多相关主题的帖子: std cout sizeof while int 
2021-12-15 18:11
rosemaryzed
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2020-7-7
得分:0 
@rjsp
2021-12-15 18:12
rosemaryzed
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2020-7-7
得分:0 
回复 3楼 rjsp
感谢r版回复
    const wchar_t* p = L"abc\0def";
    cout << wcslen(p) << endl; // 输出 3,即字符串长度
我想要得到p的值是8我该怎么做。sizeof与wcslen都取不到。
2021-12-16 19:49
rosemaryzed
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2020-7-7
得分:0 
回复 3楼 rjsp
比如是 "abc\0def\0ghi\0……"
wchar_t* p "abc\0def\0ghi\0……";就像这种数据,我想要取到他的字符串长度,但是wcslen会被0x00卡住。sizeof又分别是4和2,我该怎么做
2021-12-16 19:51
rosemaryzed
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2020-7-7
得分:0 
回复 3楼 rjsp
r版,我获取到的wchar_t*不是const的,而且数据里面有大量0x00,该怎么获取他的长度。
2021-12-16 19:52
rosemaryzed
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2020-7-7
得分:0 
回复 7楼 rjsp
感谢r版回复,我先想想到底哪里出了问题。我也感觉我哪里有问题。我想想如何表述。
2021-12-17 18:59
rosemaryzed
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2020-7-7
得分:0 
回复 8楼 rjsp
r版,一时半会我不知如何表述,但是我感觉你说的对,我先查阅一下wchar_t*的资料。无法独自解决在来请教r版,谢谢r版解惑。
2021-12-17 19:24
rosemaryzed
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2020-7-7
得分:0 
结贴,自己看百度瞎鼓捣吧需求解决了。r版是对的,根据7楼回复给了很大启发在百度瞎鼓捣解决的。
总结一下就是怀疑wchar_t*内有0x00导致wcslen计算长度对不上,最后是这样解决的。
#define _UNICODE
_TCHAR* d = (_TCHAR*)lpvoida;//原来是这样指的 wcslen(d)计算出的长度对不上
TCHAR* d = (_TCHAR*)lpvoida;//获取到的LPVOID指过来
const size_t newsize = 8192;
wchar_t dest[newsize];
wcscpy(dest,d);//拷过来
主要需求是这样解决的
DWORD dlen = _tcslen(dest)//这样程序异常。长度对不上
DWORD dlen = _tcslen(dest) * sizeof(dest[0]);//这里+一个*sizeof(dest[0])就解决了。C艹太菜,不知道原理。目前理论解决需求。
我自己也描述不清楚我的需求跟解决方案。但是问题看起来暂时是解决了。
2021-12-19 17:33
rosemaryzed
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2020-7-7
得分:0 
回复 7楼 rjsp
感谢r版指点,我自己瞎弄好像弄好了。
2021-12-19 17:33
rosemaryzed
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2020-7-7
得分:0 
回复 13楼 rjsp
R版好似醍醐灌顶,我感觉也是这个问题,字符串里面是没有0x00的,我搞错了。应该是R版说的这样。
2021-12-31 22:04



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-507884-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030911 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved