在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;
}
}
答案 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字符串逻辑用于测试该修复。