C ++ printf std :: vector - PullRequest
       56

C ++ printf std :: vector

5 голосов
/ 23 марта 2010

Как я могу сделать что-то подобное в C ++:

void my_print(format_string) {
   vector<string> data;
   //Fills vector
   printf(format_string, data);
}

my_print("%1$s - %2$s - %3$s");
my_print("%3$s - %2$s);

Я не очень хорошо объяснил раньше. Строка формата вводится пользователем приложения.

В C # это работает:

void my_print(format_string) {
 List<string> data = new List<string>();
 //Fills list
 Console.WriteLine(format_string, data.ToArray);
}

my_print("{0} - {1} - {2}");
my_print("{2} - {1}");

Ответы [ 6 ]

10 голосов
/ 23 марта 2010

Если вы собираетесь использовать потоки, вы также можете использовать ostream_iterator в сочетании с циклической конструкцией, такой как copy:

vector<string> data;
data.assign(10, "hello");

copy( &data[0], &data[3], ostream_iterator<string>(cout, " "));

Обратите внимание, что второй параметр copy указывает на один конец. Выход:

привет привет привет

9 голосов
/ 23 марта 2010
printf("%s - %s - %s", data[0].c_str(), data[1].c_str(), data[2].c_str() );

Обратите внимание, что вы должны преобразовать строки в стиле C - printf не может сделать это за вас.

Редактировать: В ответ на ваш пересмотренный вопрос, я думаю, вам придется проанализировать строку формата самостоятельно, так как вам придется проверить ее. printf () не сделает эту работу.

6 голосов
/ 23 марта 2010

Библиотека форматов Boost может быть полезна.

#include <boost/format.hpp>
#include <vector>
#include <string>
#include <iostream>
int main(int arc, char** argv){
   std::vector<std::string> array;
   array.push_back("Hello");
   array.push_back("word");
   array.push_back("Hello");
   array.push_back("again");
   boost::format f("%s, %s! %s %s! \n");
   f.exceptions( f.exceptions() &
     ~ ( boost::io::too_many_args_bit | boost::io::too_few_args_bit )  );

   for (std::vector<std::string>::iterator i=array.begin();i!=array.end();++i){
      f = f % (*i);
   }
   std::cout << f;
   return 0;
}
2 голосов
/ 05 апреля 2010

Я временно решил с помощью этой функции:

string format_vector(string format, vector<string> &items)
{   
   int counter = 1;

   replace_string(format,"\\n","\n");
   replace_string(format,"\\t","\t");

   for(vector<string>::iterator it = items.begin(); it != items.end(); ++it) {
        ostringstream stm; stm << counter;
        replace_string(format, "%" + stm.str(), *it);
        counter++;
   }
    return format;
}
1 голос
/ 23 марта 2010

Я думаю, что вы хотите сделать следующее:

  1. Преобразование std::vector<std::string> в va_list из char* с
  2. Передайте это va_list вместе с предоставленной пользователем строкой формата в vprintf.

Я все еще не знаю, как выполнить шаг 1. (Что я знаю, так это то, что большинство языков более высокого уровня, таких как Java, Scala и Ruby, имеют простое, безопасное, прямое преобразование для этого. т.)

0 голосов
/ 23 марта 2010

Позвоните тем, кого хотите

printf("%1$s - %2$s - %3$s", date[0].c_str(), data[1].c_str(), data[2].c_str());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...