C ++ printf std :: vector

时间:2010-03-23 13:15:40

标签: c++ vector printf

我如何在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 个答案:

答案 0 :(得分:10)

如果您要使用流,您还可以将ostream_iteratorcopy之类的循环结构结合使用:

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

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

请注意,copy的第二个参数指向结束后的一个参数。输出:

  

你好你好你好

答案 1 :(得分:9)

printf("%s - %s - %s", data[0].c_str(), data[1].c_str(), data[2].c_str() );

请注意,您必须转换为C风格的字符串 - printf无法为您执行此操作。

编辑:为了回答您修改过的问题,我认为您必须自己解析格式字符串,因为您必须对其进行验证。 printf()不会完成这项工作。

答案 2 :(得分:6)

Boost Format Library可能会有所帮助。

#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;
}

答案 3 :(得分:2)

我暂时解决了这个功能:

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;
}

答案 4 :(得分:1)

我认为您希望执行以下操作:

  1. 将您的std::vector<std::string>转换为va_list char*
  2. va_list以及用户提供的格式字符串传递给vprintf
  3. 我仍然不知道如何做第1步。(我所知道的是,大多数高级语言,例如Java,Scala和Ruby都有一个简单,安全,直接的转换.C ++没有'吨。)

答案 5 :(得分:-2)

拨打你想要的人

printf("%1$s - %2$s - %3$s", date[0].c_str(), data[1].c_str(), data[2].c_str());