当从“ wcslen”替换为“ strnlen_s”时,这是使用“ const char *”进行类型转换的正确方法吗?

时间:2019-08-27 11:06:38

标签: c++ c++11 casting

从“ wcslen”替换为“ strnlen_s”时,用 <Switch location={location}> {renderRoutes(routes, { ...someParams })} </Switch> 进行排版的正确方法是吗?

在下面的功能中,我要替换

const char*

使用

if (szPath[wcslen(szPath) - 1] != L'\\')

下面是代码段:

if (szPath[strnlen_s((const char*)szPath, sizeof(szPath)) - 1] != L'\\')

1 个答案:

答案 0 :(得分:2)

简短的回答:不,这绝对是 不是 的正确方法!

原因:简单地将wchar_t字符串指针转换为char指针不会改变字符串的内容。因为宽字符串的16位成分可能包含其“高字节”恰好为零的元素,所以这将表示该字符串过早终止。另外,即使不是这种情况,返回的值strnlen_s也会是您想要的值的两倍,因为它将把每个16位wchar_t视为两个8位char值。

解决方案:正如 Mathieu 所说,请改用wcsnlen_s!始终对wchar_t字符串使用wcs ...函数,对char字符串始终使用str ...函数。

编辑:另外,我在您的代码中注意到您使用了_tcscat_s。在未定义为_tcs…的字符串上使用TCHAR函数时要小心-因为TCHAR的计算结果为charwchar_t,具体取决于您的编译/构建设置。因此,添加:…对于TCHAR字符串始终使用_tcs…函数!