Я использую boost::format
(а не std::
, поскольку я использую C++ 98) для форматирования строки, которую я передаю на вызов system()
.Почему std/boost :: format вызывает это поведение c_str()?
При получении c_str()
строки, созданной format
, кажется, что она заканчивается на полпути вдоль строки. То же самое жало, созданное с литеральным значением, не имеет такой же проблемы. Что тут происходит?
Использование Boost 1.46.1 согласно BOOST_VERSION
.
#include <boost/format.hpp>
#include <iostream>
#include <string>
int main(int argc, char** argv)
{
const std::string my_str = "echo '/%1%/ some other stuff'";
boost::format fmtr(my_str);
fmtr % "sleep 3"; // should read: echo '/sleep 3/ some other stuff'
std::cout << "1: " << fmtr.str() << "\n"; // 1. echo '/sleep 3/ some other stuff' (OK)
std::cout << "2: " << fmtr.str().c_str() << "\n"; // 2. echo '/sleep 3 (BAD)
// Try the c_str of a string not created through boost::format
const std::string finished = "echo '/sleep 3/ some other stuff'";
std::cout << "3: " << finished.c_str() << "\n"; // 3. echo '/sleep 3/ some other stuff' (OK)
// Try copying the string from format to see if that makes any difference (it doesn't)
std::string copy = fmtr.str();
std::cout << "4: " << copy.c_str() << "\n"; // 4. echo '/sleep 3 (BAD)
return 0;
}
Проходя мимо c_str()
к моему system()
вызов приводит к ошибке:
sh -c: line 0: unexpected EOF while looking for matching `''
Предположительно потому, что он заканчивает на полпути вдоль струны, а также.
Не удается воспроизвести свое поведение, похоже, это ошибка для конкретного усиления или STDC++ версии, предоставить эту информацию – Slava
вы должны включить ' и' 'не' и 'main' должен возвратить' int' –
Slava
I «Извините, ваше использование кажется правильным, мое плохое. –