mbstowcs_s 函数有时调整大小 return 输入长度 + 1

mbstowcs_s function retsize sometimes return input length + 1

我在 Windows 7.

上使用 VisualStdio 2010

我想使用函数解密密码并将解密结果显示为TCHAR*

这里实现,

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

char* _decrypt_password_v1(const char* strPassword);
char Hash_v1(const char chhash, int nIndex);

#define VIT_PASSWORD _decrypt_password_v1("OOWIEJFOISJDFNPPAJ")

char* _decrypt_password_v1(const char* strPassword)
{
    unsigned int i = 0;
    char* strDecrypt = (char*)malloc(strlen(strPassword) + 1);
    memset(strDecrypt, 0x00, strlen(strPassword) + 1);
    int nLen = strlen(strPassword) -1;
    for (int i = 0; i < nLen; i++)
    {
        strDecrypt[i] = Hash_v1(strPassword[nLen - i], nLen - 1);
    }

    strDecrypt[i] = NULL;

    return strDecrypt;
}

int _tmain(int argc, _TCHAR* argv[])
{
    TCHAR szPassword[MAX_PATH] = {0};
    int nLen = strlen(VIT_PASSWORD);
    _tprintf(_T("Input Password Len : %d\n"), nLen);

    size_t outSize;
    mbstowcs_s(&outSize, szPassword, strlen(VIT_PASSWORD), VIT_PASSWORD, strlen(VIT_PASSWORD));

    _tprintf(_T("Password : %s\n"), szPassword);

    return 0;
}

如果我运行这段代码,我会报错

Debug Assertion Failed!

File: f:\dd\vctools\crt_bld\self_x86\crt\src\mbstowcs.c

Line: 283

Expression: retsize <= sizeInWords

所以,我把mbstowcs_s的参数3增加到strlen(VIT_PASSWORD) + 1

更正后的代码:

mbstowcs_s(&outSize, szPassword, strlen(VIT_PASSWORD) + 1, VIT_PASSWORD, strlen(VIT_PASSWORD));

然后没有崩溃并且 运行 正确,但是 sizeInWordsstrlen(VIT_PASSWORD),而不是 strlen(VIT_PASSWORD) + 1

如果我改用mbstowcs,就没有错误。像这样 mbstowcs(szPassword, VIT_PASSWORD, strlen(VIT_PASSWORD));

为什么会这样?如果答案不明确,我不得不这样修改我整个代码的这部分。

我需要具体的答案。

mbtowcs_s 的第三个参数应该是 wchar_ts 中第二个参数指向的缓冲区的大小,所以在你的情况下它应该是 MAX_PATH.

mbtowcs_s 的要点是确保您向目标写入的字符数不会超过 space 的字符数。这就是第三个参数的作用:告诉它你有多少space。在这种情况下,如果 VIT_PASSWORD 中没有非 ASCII 字符,目标将需要相同数量的 wchar_t 来保存转换后的字符串。因此,如果 VIT_PASSWORD 的长度为 4 个字符,加上 nul 终止符,那么 mbtowcs_s 的第三个参数将需要至少为 5 才能成功转换字符串(4 个字符加上 nul 终止符)。问题是 strlen(VIT_PASSWORD) 将 return 4,而不是 5,因为它不计算空终止符。