int i = 4;
string text = "Player ";
cout << (text + i);
印刷してほしいPlayer 4
です。
上記は明らかに間違っていますが、私がここでやろうとしていることを示しています。これを行う簡単な方法はありますか、それとも新しいインクルードの追加を開始する必要がありますか?
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);
これは逆に、つまり文字列を解析するためにも機能します。
printf("Player %d", i);
(私の回答に好きなだけ反対票を投じてください。私はまだ C++ I/O 演算子が嫌いです。)
:-P
これらは一般的な文字列に対して機能します(ファイル/コンソールに出力したくないが、後で使用するために保存したい場合など)。
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;
レコードのstd::stringstream
場合、実際に出力する前に文字列を作成する場合は、 a を使用することもできます。
cout << text << " " << i << endl;
あなたの例は、文字列の後に整数を表示したいことを示しているようです。その場合:
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
それを文字列 (または少なくともそのコピー) に追加できます。
別の可能性は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;
}
これは、以前に必要だったコードを含む、小さな実用的な変換/追加の例です。
#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行では、実際に印刷される前に変更された文字列を保存し、必要に応じて後で使用できることに注意してください。
記録として、Qt のQString
クラスを使用することもできます。
#include <QtCore/QString>
int i = 4;
QString qs = QString("Player %1").arg(i);
std::cout << qs.toLocal8bit().constData(); // prints "Player 4"
cout << text << i;
ここでの 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 を参照してください。
cout << "Player" << i ;
cout << text << i;
ostreamの<<
演算子は ostream への参照を返すため、<<
操作を連鎖させ続けることができます。つまり、上記は基本的に次のものと同じです。
cout << text;
cout << i;
cout << text << " " << i << endl;
これを理解する最も簡単な方法は次のとおりです。単一の文字列および文字列配列
として機能します。複雑なので、文字列配列を検討しています(少し同じ後に文字列が続きます)。名前の配列を作成し、それに整数と文字を追加して、 intとcharを文字列に簡単に追加できることを示します。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;
}
}
また、プレーヤーの番号をstd::string::push_back
次のように連結してみてください。
コードの例:
int i = 4;
string text = "Player ";
text.push_back(i + '0');
cout << text;
コンソールに次のように表示されます。
プレーヤー 4
いくつかのオプションがあり、どれが必要かはコンテキストによって異なります。
最も簡単な方法は
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 がより魅力的に見え始めます。
以下を使用できます
int i = 4;
string text = "Player ";
text+=(i+'0');
cout << (text);
Windows/MFC を使用していて、即時出力以上の文字列が必要な場合は、次を試してください。
int i = 4;
CString strOutput;
strOutput.Format("Player %d", i);