标签: wstring

C++ wstring如何从以NULL结尾的wchar_t数组赋值

C++标准库中的大多数文本都提到wstring等同于string,除了在wchar_t而不是char上进行参数化,然后继续演示字符串.

好吧,有时,有一些特定的怪癖,这里有一个:我似乎无法从一个以NULL结尾的16位字符数组中分配一个wstring.问题是赋值幸福地使用空字符和任何垃圾作为实际字符.这是一个非常小的减少:

typedef unsigned short PA_Unichar;
PA_Unichar arr[256];
fill(arr); // sets to 52 00 4b 00 44 00 61 00 74 00 61 00 00 00 7a 00 7a 00 7a 00
// now arr contains "RKData\0zzz" in its 10 first values
wstring ws;
ws.assign((const wchar_t *)arr);
int l = ws.length();
Run Code Online (Sandbox Code Playgroud)

此时l不是预期的6("RKData"中的字符数),而是更大.在我的测试运行中,它是29.为什么29?不知道.内存转储不会显示第29个字符的任何特定值.

所以问题是:这是我的标准C++库(Mac OS X Snow Leopard)中的错误,还是我的代码中的错误?我应该如何将一个16位字符的空终止数组分配给wstring?

谢谢

c++ unicode wstring

0
推荐指数
1
解决办法
4597
查看次数

从文件保存对话框返回文件名(windows32)

我有一个简单的保存文件对话框,我希望将其用作返回文件路径,名称和扩展名的工具.此函数产生运行时错误,表示文件名周围的堆栈已损坏.我希望像这样使用它:

wchar_t filename[] = L"";
newGradebookDialog( hwnd, filename );
Run Code Online (Sandbox Code Playgroud)

这是我的功能.它按照我的预期修改了文件名,但运行时堆栈错误是我没有得到的.

void newGradebookDialog( HWND hwnd, wchar_t file[] )
{
 OPENFILENAME ofn;

 wchar_t saveFileName[MAX_PATH] = L"";

 ZeroMemory( &ofn, sizeof( ofn ) );

 ofn.lStructSize = sizeof(OPENFILENAME);
 ofn.hwndOwner = hwnd;
 ofn.lpstrFilter = L"Database File (*.db)\0*.db\0";
 ofn.lpstrFile = saveFileName;
 ofn.nMaxFile = MAX_PATH;
 ofn.lpstrDefExt = L"db";
 ofn.Flags  = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
 ofn.lpstrTitle = L"Save New Database";

 if(GetSaveFileName(&ofn))
  wcscpy(file,saveFileName);
}
Run Code Online (Sandbox Code Playgroud)

c++ winapi wstring savefiledialog

0
推荐指数
1
解决办法
813
查看次数

堆内存分配崩溃与std :: wstring

我有一个std :: wstring内存分配的大问题.我尝试使用此代码时程序崩溃:

size_t size;
mbstowcs_s(&size, NULL, 0, buffer, _TRUNCATE);
wchar_t *buffer2 = (wchar_t*)malloc(size + 1);
mbstowcs_s(&size, buffer, buffer_size, buffer, _TRUNCATE);
buffer2[size] = '\0';

std::wstring data(buffer);
Run Code Online (Sandbox Code Playgroud)

崩溃是在最后一行,如果我使用以下行不会发生:

std::wstring data(L"hello");
Run Code Online (Sandbox Code Playgroud)

错误是内存堆分配失败,结果是程序崩溃.为什么?怎么了?

c++ crash unicode wstring

0
推荐指数
2
解决办法
1985
查看次数

wstring.find_last_not_of()将国际字符之后的所有内容视为空格?

#include <iostream>
#include <windows.h>
using namespace std;

int main() {
  wstring my_str(L"El Niño     ");
  cout << my_str.find_last_not_of(L' ');
}
Run Code Online (Sandbox Code Playgroud)

此代码返回6但不应返回7?

c++ unicode wstring

0
推荐指数
1
解决办法
265
查看次数

为什么字符串有时写在一个方向,有时在另一个方向?

这是代码:

byte bytes[] = {0x2e, 0x20, 0x65, 0x00, 0x74, 0x00, 0x61, 0x00, 0x64, 0x00, 0x70, 0x00, 0x75, 0x00, 0x67, 0x00};
std::wstring s;
s.resize( 8 );
memcpy( &s[0], bytes, 16 );

_tprintf( _T("key: %s\n"), s.c_str());
MessageBox ( 0, s.c_str(), _T(""), 0 );
Run Code Online (Sandbox Code Playgroud)

消息框中的结果gupdate位于控制台中?etadpug.

我认为这是编码.0x2e20或0x202e是什么意思吗?

c++ encoding byte-order-mark wstring

0
推荐指数
1
解决办法
147
查看次数

如何使函数适用于字符串和wstring?

如果我想要一个像下面这样的功能basic_string<char>,basic_string<wchar>我该怎么办?请注意,它必须wchar_t在无序映射中进行更改.

该函数还需要接受wchar_t数组以支持将参数作为文字传递.

bool isUnique(wstring s)
{
    if (s.size() <= 1)
    {
        return true;
    }
    unordered_map<wchar_t, bool> charSeen;
    for (int i = 0; i < s.size(); i++)
    {
        if (!charSeen[s[i]])
        {
            charSeen[s[i]] = true;
        }
        else
        {
            return false;
        }
    }
    return true;
}
int main(int argc, char *argv[]) {
    cout << isUnique(L"???");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ string unicode wstring

0
推荐指数
1
解决办法
781
查看次数

在C++中从char数组的一部分构造一个字符串

我有一个非常大的wchar_t数组.我想从这个wchar_t数组的一部分构造一个wstring,例如在i和j之间.

我不想将大字符数组转换为wstring,然后取一个子字符串.

我该怎么办?

c++ arrays string wstring

-3
推荐指数
1
解决办法
722
查看次数

为什么在分配wstring时会出现L?

为什么在创建wstring时字符串前面有一个L?

例如 -

std::string = "regular string :3";
std::wstring = L"wide string :/";
Run Code Online (Sandbox Code Playgroud)

是因为它是用LPSTR,LPWSTR和LPCSTR引用的吗?

c++ string wstring

-3
推荐指数
1
解决办法
1260
查看次数

为什么我的C++代码显示阿拉伯文字?

我有一个代码片使用std::wstringwstringstream:

static std::wstring floatToWString(float val)
{
    std::wstringstream stream;
    stream.precision(8);
    stream.setf(std::ios_base::fixed, std::ios_base::floatfield);
    stream << val;
    return std::wstring(stream.str());
}
Run Code Online (Sandbox Code Playgroud)

当我在我的代码的'stream'变量中观察时,我看到了类似的东西:

调试的截图

据我所知,这些是一些阿拉伯语短语.这怎么可能?

我在Debug和X64配置中使用Visual Studio 2013.它是关于Wstring或Visual Studio调试模式或其他什么?我怀疑它只是一块记忆片,但在我重置电脑之后却是一样的.

编辑:对于一些谁说它是关于随机内存块或它是关于不是空终止字符串,我尝试在另一个唯一的程序,如: 试试吧

c++ wstring

-12
推荐指数
1
解决办法
503
查看次数