std::smatch match;
...
TRACE("%s\n",match[0]); // this outputs some garbage like this '˜ò'
%s
спецификатор типа в TRACE
макро ожидает указатель на строку с сырой C (char*
в ANSI/MBCS строит, wchar_t*
в Unicode строит - Я предполагаю, что вы делаете ANSI/MBCS здесь.).
Но match[0]
не необработанный указатель строки С.
Так у вас есть несоответствие между тем, что вы обещали TRACE
через %s
(т.е. сырой C строка char*
указатель), и то, что вы на самом деле переходя к ней (т.е. match[0]
).
Согласно some online documentation, std::smatch
является конкретизацией std::match_results
шаблона, в частности:
smatch --> match_results<string::const_iterator>
smatch::operator[]
(который вы ссылаетесь в вашем коде, как match[0]
) returns a reference to another object, который является std::sub_match
. Этот std::sub_match
class представляет пару итераторов, обозначающих последовательности совпадающих символов.
Итак, вы обещают к TRACE
передать строковый указатель сырым C (через %s
спецификатор типа), но на самом деле вы пропусканием совершенно разные вещи, то есть ссылки на std::sub_match
объекта (через ваш match[0]
): неудивительно, что напечатанный текст не имеет смысла.
Что вам нужно сделать, так это получить указатель строки C из выражения match[0]
.
Для этого вы можете вызвать std::sub_match
's str()
method.Это возвращает объект std::string
.
Однако этот std::string
объект не именно то, что %s
ожидает, что: на самом деле, %s
представляет собой сырой указатель С строку (например, const char*
), неstd::string
экземпляра.
Итак, последний шаг - извлечь этот необработанный указатель строки C из объекта std::string
, и это делается путем вызова std::string::c_str()
method.
Суммируя эти логические шаги:
std::smatch match;
...
match[0] --> reference to std::sub_match object
match[0].str() --> std::string object
match[0].str().c_str() --> raw C string pointer (const char*)
Итак, ваше TRACE
утверждение можно записать в виде:
TRACE("%s\n", match[0].str().c_str());
Для образца кода, как это, просто поместите строку в коде вместо вызова ' test.GetString() '. Таким образом, выясняется, что происходит. –
Я не могу поместить весь html ... Это tooo long – Rana
Хорошо, но попробуйте поставить более короткую строку, которая показывает проблему. –