2016-07-13 1 views
1

Я использую 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 `'' 

Предположительно потому, что он заканчивает на полпути вдоль струны, а также.

+1

Не удается воспроизвести свое поведение, похоже, это ошибка для конкретного усиления или STDC++ версии, предоставить эту информацию – Slava

+0

вы должны включить ' и' 'не' и 'main' должен возвратить' int' – Slava

+0

I «Извините, ваше использование кажется правильным, мое плохое. –

ответ

0

При правильной включает ваша программа работает отлично: ideone

#include <boost/format.hpp> 
#include <iostream> 
#include <string> 

int main() 
{ 
    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) 
} 

Вы должны исправить включает и возвращаемый тип основного и повторите попытку. Если неправильное поведение сохраняется, скорее всего, вы нарушили версию библиотеки C++ и/или boost.