/ / c ++ получите знака i от wstring - c ++

C + + получите символа i от wstring - c ++

Имам малък проблем, но не мога да разбера защо.

имам std::wstring text със стойност от L"test"

След това се опитвам да отпечатам първия си герой така:

OutputDebugString(&text[0]);

но резултатът е test..

когато използвам OutputDebugString(&text[1]);

Резултатът е est

Мислех, че достъпът до масив трябва да ми даде характер на определено местоположение. Може ли някой да ми каже какво трябва да правя или правя грешно?

Аз също се опитах .at(i); със същия резултат.

Схванах го:

wchar_t st = text[0];

OutputDebugString(&st);

Алекс Рейкинг заяви, че това е по-добро и по-безопасно решение: (тъй като низът съдържа нулев терминатор)

wchar_t st[3] = { text[0], 0x0 };
OutputDebugString(&st[0]);

Благодаря за помощта

Отговори:

3 за отговор № 1

Това е така, защото в паметта низът изглежда така:

      V-- &text[0]
addr: 0x80000000 0x80000001 0x80000002 0x80000003 0x80000004
text: t,         e,         s,         t,         0x00
^-- text[0]

Така че, когато поискате адреса на text[1] това, което получавате, е:

      V-- &text[1]
addr: 0x80000001 0x80000002 0x80000003 0x80000004
text: e,         s,         t,         0x00
^-- text[1]

Което ви оставя e,x,t,NULL или низа "ext". Функцията, която наричате, ще използва всички символи до терминатора.


1 за отговор № 2

А низ е поредица от знаци, последвана от нулев терминатор.

Най- OutputDebugString (и повечето функции в C и WinAPI)които приемат низове) приемат указател на първия знак на такъв низ. Функцията поддържа печатане на символи от това местоположение и следващите местоположения, докато не пресметне нулевия терминатор.

Ако искате да действате само върху един знак, трябва или да извикате функция, която очаква един знак, или да създадете низ с дължина 1, съдържащ този знак и нулев терминатор.


0 за отговор № 3

OutputDebugString отнема низ, следователно тойще започне с адреса, който сте дали и ще продължим докрай, докато не достигне NULL. За да отговорите на конкретния си проблем, трябва да напишете своя собствена функция, която ще отнеме един знак от низа, след това да го постави в нов низ, а след това да изведе този нов низ.


-3 за отговор № 4

OutputDebugStringW (text.c_str ()); трябва да правите каквото искате