如何将一个int附加到C ++中的string?
int i = 4; string text = "Player "; cout << (text + i);
我想要它打印Player 4
。
以上显然是错误的,但它显示了我想在这里做什么。 有没有一个简单的方法来做到这一点,或者我必须开始添加新的包括?
那么,如果你使用cout,你可以直接写入整数,就像在
std::cout << text << i;
将各种对象转换为string的C ++方法是通过stringstream 。 如果你没有一个方便,只需创build一个。
#include <sstream> std::ostringstream oss; oss << text << i; std::cout << oss.str();
或者,您可以转换整数并将其附加到string。
oss << i; text += oss.str();
最后,Boost库提供了boost::lexical_cast
,它用类似于内置types转换的语法封装了stringstream转换。
#include <boost/lexical_cast.hpp> text += boost::lexical_cast<std::string>(i);
这也适用于其他方式,即parsingstring。
用C ++ 11,你可以写:
int i = 4; std::string text = "Player "; text += std::to_string(i);
printf("Player %d", i);
(Downvote我所有你喜欢的答案,我仍然讨厌C ++ IO操作符。)
😛
这些工作的一般string(如果你不想输出到文件/控制台,但存储以备后用)。
boost.lexical_cast
MyStr += boost::lexical_cast<std::string>(MyInt);
串stream
//sstream.h std::stringstream Stream; Stream.str(MyStr); Stream << MyInt; MyStr = Stream.str(); //if you're using a stream (eg cout), rather than std::string someStream << MyInt;
为了logging,如果要在实际输出之前创buildstring,还可以使用std::stringstream
。
cout << text << " " << i << endl;
另一种可能性是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; }
你的例子似乎表明你想显示一个string后面跟一个整数,在这种情况下:
string text = "Player: "; int i = 4; cout << text << i << endl;
会正常工作。
但是,如果要存储string位置或将其传递,并经常这样做,则可能会使加法运算符重载。 我在下面演示这个:
#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
有一个定义的stream输出,你可以把它附加到你的string(或者至less是它的一个副本)。
为了logging,你也可以使用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;
cout << "Player" << 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
请注意,在最后两行中,您将修改的string保存在实际打印出的string之前,如果需要,可以稍后使用它。
这里的一个方法是直接打印输出,如果在你的问题中需要的话。
cout << text << i;
否则,最安全的方法之一就是使用
sprintf(count, "%d", i);
然后将其复制到您的“文本”string。
for(k = 0; *(count + k); k++) { text += count[k]; }
因此,你有你需要的输出string
有关sprintf
更多信息,请按照: http : //www.cplusplus.com/reference/cstdio/sprintf
我可以解决这个问题的最简单的方法是:
它将作为一个单一的string和string数组 。 我正在考虑一个string数组,因为它是复杂的(跟随string一样)。 我创build了一个名称的数组,并附加一些整数和字符与它来显示它是多么容易附加一些int和string,希望它有帮助。 长度只是测量数组的大小。 如果你熟悉编程,那么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; } }
cout << text << i;
ostream的<<
运算符返回一个对ostream的引用,所以你可以继续链接<<
操作。 也就是说,以上基本上是一样的:
cout << text; cout << i;
cout << text << " " << i << endl;
有几个选项,你想要哪一个取决于上下文。
最简单的方法是
std::cout << text << i;
或者如果你想在一条线上
std::cout << text << i << endl;
如果你正在编写一个单线程的程序,并且如果你不是很多地调用这个代码(其中“很多”是每秒数千次),那么你就完成了。
如果你正在编写一个multithreading程序,并且有多个线程正在向cout写入数据,那么这个简单的代码可能会让你陷入困境。 让我们假设你的编译器附带的库使得cout线程安全,比任何单个调用都不会中断。 现在让我们说一个线程正在使用这个代码来写“玩家1”,另一个是写“玩家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,并且您的编译器再次提供了一个具有合理线程安全性的运行时库(每个函数调用都是primefaces的),那么下面的代码会更好:
printf("Player %d\n", i);
能够在单个函数调用中执行某些操作,可以使io库在提供的同时提供同步,现在您的整行文本将以primefaces方式编写。
对于简单的程序,std :: cout很棒。 抛出multithreading或其他复杂性,不太时髦的printf开始看起来更有吸引力。
你也可以尝试用std::string::push_back
连接玩家的号码:
您的代码示例:
int i = 4; string text = "Player "; text.push_back(i + '0'); cout << text;
您将在控制台中看到:
球员4
您可以使用以下内容
int i = 4; string text = "Player "; text+=(i+'0'); cout << (text);
如果使用Windows / MFC,并且需要多于立即输出的string,请尝试:
int i = 4; CString strOutput; strOutput.Format("Player %d", i);