189
int i = 4;
string text = "Player ";
cout << (text + i);

印刷してほしいPlayer 4です。

上記は明らかに間違っていますが、私がここでやろうとしていることを示しています。これを行う簡単な方法はありますか、それとも新しいインクルードの追加を開始する必要がありますか?

4

20 に答える 20

211

cout を使用すると、次のように整数を直接書き込むことができます。

std::cout << text << i;

すべての種類のオブジェクトを文字列に変換する C++ の方法は、文字列ストリームを使用することです。手元にない場合は、作成してください。

#include <sstream>

std::ostringstream oss;
oss << text << i;
std::cout << oss.str();

または、整数を変換して文字列に追加することもできます。

oss << i;
text += oss.str();

最後に、Boost ライブラリは を提供しますboost::lexical_cast。これは、組み込み型キャストのような構文で文字列ストリーム変換をラップします。

#include <boost/lexical_cast.hpp>

text += boost::lexical_cast<std::string>(i);

これは逆に、つまり文字列を解析するためにも機能します。

于 2008-09-15T17:14:11.260 に答える
125
printf("Player %d", i);

(私の回答に好きなだけ反対票を投じてください。私はまだ C++ I/O 演算子が嫌いです。)

:-P

于 2008-09-15T17:13:54.367 に答える
18

これらは一般的な文字列に対して機能します(ファイル/コンソールに出力したくないが、後で使用するために保存したい場合など)。

boost.lexical_cast

MyStr += boost::lexical_cast<std::string>(MyInt);

文字列ストリーム

//sstream.h
std::stringstream Stream;
Stream.str(MyStr);
Stream << MyInt;
MyStr = Stream.str();

// If you're using a stream (for example, cout), rather than std::string
someStream << MyInt;
于 2008-09-15T17:13:01.123 に答える
9

レコードのstd::stringstream場合、実際に出力する前に文字列を作成する場合は、 a を使用することもできます。

于 2008-09-15T17:12:38.283 に答える
7
cout << text << " " << i << endl;
于 2008-09-15T17:10:57.837 に答える
4

あなたの例は、文字列の後に整数を表示したいことを示しているようです。その場合:

string text = "Player: ";
int i = 4;
cout << text << i << endl;

うまくいくでしょう。

ただし、文字列の場所を保存したり渡したりする予定があり、これを頻繁に行う場合は、加算演算子をオーバーロードすることでメリットが得られる場合があります。これを以下に示します。

#include <sstream>
#include <iostream>
using namespace std;

std::string operator+(std::string const &a, int b) {
  std::ostringstream oss;
  oss << a << b;
  return oss.str();
}

int main() {
  int i = 4;
  string text = "Player: ";
  cout << (text + i) << endl;
}

実際、テンプレートを使用して、このアプローチをより強力にすることができます。

template <class T>
std::string operator+(std::string const &a, const T &b){
  std::ostringstream oss;
  oss << a << b;
  return oss.str();
}

これで、オブジェクトにストリーム出力が定義されている限り、bそれを文字列 (または少なくともそのコピー) に追加できます。

于 2013-05-17T03:12:04.363 に答える
3

別の可能性はBoost.Formatです:

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

int main() {
  int i = 4;
  std::string text = "Player";
  std::cout << boost::format("%1% %2%\n") % text % i;
}
于 2009-06-02T18:47:04.287 に答える
2

これは、以前に必要だったコードを含む、小さな実用的な変換/追加の例です。

#include <string>
#include <sstream>
#include <iostream>

using namespace std;

int main(){
string str;
int i = 321;
std::stringstream ss;
ss << 123;
str = "/dev/video";
cout << str << endl;
cout << str << 456 << endl;
cout << str << i << endl;
str += ss.str();
cout << str << endl;
}

出力は次のようになります。

/dev/video
/dev/video456
/dev/video321
/dev/video123

最後の2行では、実際に印刷される前に変更された文字列を保存し、必要に応じて後で使用できることに注意してください。

于 2011-07-15T10:32:32.047 に答える
2

記録として、Qt のQStringクラスを使用することもできます。

#include <QtCore/QString>

int i = 4;
QString qs = QString("Player %1").arg(i);
std::cout << qs.toLocal8bit().constData();  // prints "Player 4"
于 2011-06-23T13:53:29.400 に答える
1
cout << text << i;
于 2008-09-15T17:10:54.373 に答える
1

ここでの 1 つの方法は、問題で必要な場合に出力を直接印刷することです。

cout << text << i;

それ以外の場合、最も安全な方法の1つは使用することです

sprintf(count, "%d", i);

そして、それを「テキスト」文字列にコピーします。

for(k = 0; *(count + k); k++)
{ 
  text += count[k]; 
} 

したがって、必要な出力文字列が得られます

の詳細については、 httpsprintf : //www.cplusplus.com/reference/cstdio/sprintf を参照してください。

于 2015-09-04T02:53:33.133 に答える
0
cout << "Player" << i ;
于 2008-09-15T17:10:45.840 に答える
0
cout << text << i;

ostreamの<<演算子は ostream への参照を返すため、<<操作を連鎖させ続けることができます。つまり、上記は基本的に次のものと同じです。

cout << text;
cout << i;
于 2008-09-15T17:10:58.100 に答える
0
cout << text << " " << i << endl;
于 2008-09-15T17:12:34.027 に答える
0

これを理解する最も簡単な方法は次のとおりです。単一の文字列および文字列配列
として機能します。複雑なので、文字列配列を検討しています(少し同じ後に文字列が続きます)。名前の配列を作成し、それに整数と文字を追加して、 intcharを文字列に簡単に追加できることを示します。length は、配列のサイズを測定するだけです。プログラミングに精通している場合、size_tは unsigned intです。

#include<iostream>
    #include<string>
    using namespace std;
    int main() {

        string names[] = { "amz","Waq","Mon","Sam","Has","Shak","GBy" }; //simple array
        int length = sizeof(names) / sizeof(names[0]); //give you size of array
        int id;
        string append[7];    //as length is 7 just for sake of storing and printing output 
        for (size_t i = 0; i < length; i++) {
            id = rand() % 20000 + 2;
            append[i] = names[i] + to_string(id);
        }
        for (size_t i = 0; i < length; i++) {
            cout << append[i] << endl;
        }


}
于 2015-11-18T15:46:04.930 に答える
-1

また、プレーヤーの番号をstd::string::push_back次のように連結してみてください。

コードの例:

int i = 4;
string text = "Player ";
text.push_back(i + '0');
cout << text;

コンソールに次のように表示されます。

プレーヤー 4

于 2016-05-25T11:04:41.780 に答える
-1

いくつかのオプションがあり、どれが必要かはコンテキストによって異なります。

最も簡単な方法は

std::cout << text << i;

または、これを1行にしたい場合

std::cout << text << i << endl;

シングル スレッド プログラムを作成していて、このコードをあまり呼び出していない場合 ("a lot" は 1 秒あたり数千回)、作業は完了です。

マルチスレッド プログラムを作成していて、複数のスレッドが cout に書き込みを行っている場合、この単純なコードで問題が発生する可能性があります。コンパイラに付属のライブラリが cout スレッドを十分に安全にしており、それに対する単一の呼び出しが中断されないと仮定しましょう。ここで、あるスレッドがこのコードを使用して「Player 1」を書き込んでおり、別のスレッドが「Player 2」を書き込んでいるとします。運が良ければ、次のものが得られます。

Player 1
Player 2

運が悪いと、次のようなものが得られる可能性があります

Player Player 2
1

問題は std::cout << text << i << endl; です。3 つの関数呼び出しに変わります。コードは次と同等です。

std::cout << text;
std::cout << i;
std::cout << endl;

代わりに C スタイルの printf を使用し、コンパイラが適切なスレッド セーフ (各関数呼び出しはアトミック) を備えたランタイム ライブラリを提供した場合は、次のコードの方が適切に機能します。

printf("Player %d\n", i);

1 回の関数呼び出しで何かを実行できるため、io ライブラリが内部で同期を提供できるため、テキスト行全体がアトミックに書き込まれます。

単純なプログラムの場合、std::cout は優れています。マルチスレッドやその他の複雑な機能を追加すると、スタイリッシュではない printf がより魅力的に見え始めます。

于 2008-09-15T18:13:49.510 に答える
-3

以下を使用できます

int i = 4;
string text = "Player ";
text+=(i+'0');
cout << (text);
于 2013-03-03T03:41:47.903 に答える
-5

Windows/MFC を使用していて、即時出力以上の文字列が必要な場合は、次を試してください。

int i = 4;
CString strOutput;
strOutput.Format("Player %d", i);
于 2011-06-27T09:23:28.073 に答える