std :: wstring: объединение с + не имеет никакого эффекта - PullRequest
2 голосов
/ 17 октября 2011

Решение, наверное, очевидно, но я его не вижу.У меня есть этот простой код C ++:

// Build the search pattern
// sPath is passed in as a parameter into this function
trim_right_if(sPath, is_any_of(L"\\"));
wstring sSearchPattern = sPath + L"\\*.*";

Моя проблема в том, что оператор + не имеет никакого эффекта (проверено в отладчике).Строка sSearchPattern инициализируется только значением sPath.

Примечания: sPath - это wstring.

Пример того, чего я хочу достичь:

sSearchPattern -> C:\SomePath\*.*

Дополнительная информация:

Когда я смотрю на sPath в отладчике, я вижу два символа NULL после последнего символа.Когда я смотрю на sSearchPattern, «\ *. *» Добавляется, но после двух символов NULL.Любое объяснение этому?

Ответы [ 3 ]

8 голосов
/ 17 октября 2011

Это должно работать, и действительно работает для меня на VS2010, SP1:

#include <iostream>
#include <string>

int main()
{
    const std::wstring sPath = L"C:\\SomePath";
    const std::wstring sSearchPattern = sPath + L"\\*.*";

    std::wcout << sSearchPattern << L'\n';

    return 0;
}

Это печатает

C:\SomePath\*.*

для меня.

3 голосов
/ 17 октября 2011

Как я выяснил, два символа NULL, хранящиеся в конце строки, были проблемой.Очевидно, std :: wstring не заботится о NULL, как это делает старая добрая строка C.Если он считает, что длина строки составляет 10 символов, ему все равно, являются ли некоторые из этих 10 символов значениями NULL.Если вы затем добавите к этой строке, дополнительные символы будут добавлены после 10-го символа.Если последними символами строки являются NULL, вы получите:

C:\\SomePath\0\0\\*.*

Такая строка не может быть использована в любом месте.

Как я получил символы NULL в конце оригинальной строки?Я использовал wstring.resize () в другой функции, которая дополняет строку значениями NULL.Я сделал это для того, чтобы передать & string [0] в функцию Windows API, ожидающую LPWSTR.

Теперь, когда я знаю, что это не работает, я вместо этого использую настоящий LPWSTR.Это немного более неуклюже, но это работает.Исходя из MFC, я подумал, что мог бы использовать std :: wstring как CString с его методами GetBuffer и Release.

0 голосов
/ 17 октября 2011

Что-то в вашем реальном коде добавляет дополнительные нулевые символы в конец строки.Ваша ошибка заключается в этом коде.

Конкатенация строк работает отлично.std::wstring не завершается нулем, поэтому конкатенация просто добавляет в конец буфера.Это делает std::wstring несколько отличным от строки C, поскольку может содержать нулевые символы.Я подозреваю, что этот нюанс является источником всей путаницы.

...