2

文字列を引数として取り、この文字列を、その Api の別の文字列にフォーマット指定子を配置した場所に配置するパブリック API を作成したいと考えています。

e.g. string PrintMyMessage( const string& currentValAsString)
     {
          string s1("Current value is %s",currentValAsString);
          return s1;
     }

現在、次のビルド エラーが発生しています。

1>d:\extra\creatingstrwithspecifier\creatingstrwithspecifier\main.cxx(8): error C2664: 'std::basic_string<_Elem,_Traits,_Ax>::basic_string(const std::basic_string<_Elem,_Traits,_Ax> &,unsigned int,unsigned int)' : cannot convert parameter 2 from 'const std::string' to 'unsigned int'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>,
1>              _Ax=std::allocator<char>
1>          ]
1>          No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

このタスクを達成するためのより良い方法を知りたいだけです。

4

4 に答える 4

1

このかなり似た質問でも説明されているように、 Boost Format Libraryを使用できます。例えば:

std::string PrintMyMessage( const string& currentValAsString )
{
  boost::format fmt = boost::format("Current value is %s") % currentValAsString; 
  // note that you could directly use cout:
  //std::cout << boost::format("Current value is %s") % currentValAsString;
  return fmt.str();
}

他の質問への回答では、stringstreams、snprintf、または文字列連結を使用するなど、他のアプローチも見つけることができます。

完全な一般的な例を次に示します。

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

std::string greet(std::string const & someone) {
    boost::format fmt = boost::format("Hello %s!") % someone;
    return fmt.str();
}

int main() {
    std::cout << greet("World") << "\n";
}

または、Boost を使用できない、または使用したくない場合:

#include <iostream>
#include <string>
#include <vector>
#include <cstdio>

std::string greet(std::string const & someone) {
    const char fmt[] = "Hello %s!";
    std::vector<char> buf(sizeof(fmt)+someone.length());
    std::snprintf(&buf[0], buf.size(), fmt, someone.c_str());
    return &buf[0];
}

int main() {
    std::cout << greet("World") << "\n";
}

どちらの例でも、次の出力が生成されます。

$ g++ test.cc && ./a.out
Hello World!
于 2012-06-11T09:56:54.540 に答える
0
string PrintMyMessage( const string& currentValAsString)
{
    char buff[100];
    sprintf(buff, "Current value is %s", currentValAsString.c_str());

    return buff;
}
于 2012-06-11T10:01:52.033 に答える
0
string PrintMyMessage(const char* fmt, ...)
{
    char buf[1024];
    sprintf(buf, "Current value is ");

    va_list ap;
    va_start(ap, fmt);
    vsprintf(buf + strlen(buf), fmt, ap);

    return buf;
}

string str = PrintMyMessage("Port is %d, IP is :%s", 80, "192.168.0.1");
于 2012-06-11T10:04:54.297 に答える
-2

これを簡単に書くことができます:

return  "Current value is " + currentValAsString;
于 2012-06-11T10:04:10.940 に答える