C++ printf std::vector

Come posso fare qualcosa di simile a questo in 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);

Non mi sono spiegato bene prima. Il formato della stringa immessa dall’utente dell’applicazione.

In C# funziona:

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}");
Che cosa fa esattamente %1$s?
%1$s, di stampare la prima stringa, %2$s per la seconda e così via…
C# è l’introspezione, il C++ non (almeno non in scatola), quindi non si può semplicemente stampare oggetti arbitrari. Aggiungere altri contesti come se avete solo bisogno di uscita string oggetti etc.
Presumo che il suo matrici hanno potenzialmente un numero variabile di elementi.
Sì e la stringa di formato può cambiare.

InformationsquelleAutor Sebtm | 2010-03-23

6 Replies
  1. 10

    Se avete intenzione di utilizzare i flussi, è possibile utilizzare anche ostream_iterator in combinazione con un costrutto come copy:

    vector<string> data;
    data.assign(10, "hello");
    
    copy( &data[0], &data[3], ostream_iterator<string>(cout, " "));

    Nota che il secondo parametro copy punti al passato il fine. Uscita:

    ciao ciao ciao

    Ma l’uscita dell’OP che volevo era “ciao – ciao – ciao”
    ostream_iterator non fare il lavoro qui. Aggiunge il delimitatore di ogni scrittura, mentre l’interrogante vuole un separatore (cioè non viene aggiunto dopo l’ultimo scrittura).
    Steve: Vero. Tuttavia, questa è una tecnica che ho trovato molte persone non hanno familiarità con quello che è utile e conciso in molte situazioni in cui un normale printf è desiderato. Per esempio, lo scarico dei dati di debug per lo schermo.
    Ma non è inclusa nella norma, un ostream_iterator classe che solo inserti separatori è del tutto possibile. vedi: groups.google.com/group/comp.lang.c++/msg/a746a588cedfa44b
    Non si desidera utilizzare &data[0] e &data[3] — standard non garantisce che funzionerà. Si dovrebbe usare data.begin() e data.end() invece.

    InformationsquelleAutor John Dibling

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

    Di notare che è necessario convertire stringhe C-style – printf non può fare questo per voi.

    Edit: In risposta al tuo rivisto domanda, penso che si dovrà analizzare la stringa di formato da soli, in quanto sarà necessario per la convalida. printf() non fare il lavoro.

    InformationsquelleAutor

  3. 6

    Il Boost Formato Biblioteca potrebbe essere utile.

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

    InformationsquelleAutor Ken Bloom

  4. 2

    Ho temporaneamente risolto con questa funzione:

    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;
    }
    Penso che sia una bella soluzione ragionevole.

    InformationsquelleAutor Sebtm

  5. 1

    Penso che stai cercando di effettuare le seguenti operazioni:

    1. Convertire il vostro std::vector<std::string> in un va_list di char*s
    2. Pass che va_list, insieme con l’utente fornita in formato stringa vprintf.

    Ancora non so come fare passo 1. (Quello che so è che la maggior parte dei linguaggi di alto livello come Java, Scala, e Ruby sono un metodo semplice e sicuro, la conversione diretta. C++ non.)

    InformationsquelleAutor Ken Bloom

  6. -2

    Chiamare quelli che si desidera

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

    InformationsquelleAutor wheaties

Lascia un commento