如何将一个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

我可以解决这个问题的最简单的方法是:
它将作为一个单一的stringstring数组 。 我正在考虑一个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);