生成随机unicode字符串

时间:2014-05-25 08:39:16

标签: c++ visual-studio-2010 unicode

在VS2010中,下面的这个功能打印错误状态" stdout",我无法理解原因。对我做错了什么的想法?

void printUnicodeChars()
{
    const auto beg = 0x0030;
    const auto end = 0x0039;

    wchar_t uchars[end-beg+2];

    for (auto i = beg; i <= end; i++) {
        uchars[i-beg] = i; // I tried a static_cast<wchar_t>(i), still errors!
    }

    uchars[end+1] = L'\0';

    std::wcout << uchars << std::endl;

    if (!std::wcout) {
        std::cerr << std::endl << "stdout in error state" << std::endl;
    } else {
        std::cerr << std::endl << "stdout is good" << std::endl;
    }
}

1 个答案:

答案 0 :(得分:2)

感谢@ 0x499602D2,我发现我的函数中有一个数组越界错误。为了更清楚,我希望我的函数构造一个unicode字符串,其字符在[start,end]范围内。这是我的最终版本:

// Generate an unicode string of length 'len' whose characters are in range [start, end]
wchar_t* generateRandomUnicodeString(size_t len, size_t start, size_t end)
{
    wchar_t* ustr = new wchar_t[len+1];      // +1 for '\0'
    size_t intervalLength = end - start + 1; // +1 for inclusive range

    srand(time(NULL));
    for (auto i = 0; i < len; i++) {
        ustr[i] = (rand() % intervalLength) + start;
    }
    ustr[len] = L'\0'; 
    return ustr;
}

当按如下方式调用此函数时,它会生成一个包含5个西里尔字符的unicode字符串。

int main()
{
    _setmode(_fileno(stdout), _O_U16TEXT);

    wchar_t* output = generateRandomUnicodeString(5, 0x0400, 0x04FF);

    wcout << "Random Unicode String = " << output << endl;

    delete[] output;

    return 0;
}

PS:这个功能看似奇怪和任意,对我来说是一个通常的目的,我需要为单元测试用例生成示例字符串,检查是否从数据库中正确编写和检索unicode字符串,这是c ++应用程序的后端。在过去,我们看到包含非ASCII字符的unicode字符串失败,我们跟踪该错误并修复它,这个随机的unicode字符串逻辑用于测试该修复。