답변:
알파벳 순서로 :
std::string name = "John";
int age = 21;
std::string result;
// 1. with Boost
result = name + boost::lexical_cast<std::string>(age);
// 2. with C++11
result = name + std::to_string(age);
// 3. with FastFormat.Format
fastformat::fmt(result, "{0}{1}", name, age);
// 4. with FastFormat.Write
fastformat::write(result, name, age);
// 5. with the {fmt} library
result = fmt::format("{}{}", name, age);
// 6. with IOStreams
std::stringstream sstm;
sstm << name << age;
result = sstm.str();
// 7. with itoa
char numstr[21]; // enough to hold all numbers up to 64-bits
result = name + itoa(age, numstr, 10);
// 8. with sprintf
char numstr[21]; // enough to hold all numbers up to 64-bits
sprintf(numstr, "%d", age);
result = name + numstr;
// 9. with STLSoft's integer_to_string
char numstr[21]; // enough to hold all numbers up to 64-bits
result = name + stlsoft::integer_to_string(numstr, 21, age);
// 10. with STLSoft's winstl::int_to_string()
result = name + winstl::int_to_string(age);
// 11. With Poco NumberFormatter
result = name + Poco::NumberFormatter().format(age);
#include <string>
)#include <sstream>
(표준 C ++에서)String(number)
.
C ++ 11에서는 다음과 같이 사용할 수 있습니다 std::to_string
.
auto result = name + std::to_string( age );
Boost가있는 경우을 사용하여 정수를 문자열로 변환 할 수 있습니다 boost::lexical_cast<std::string>(age)
.
다른 방법은 문자열 스트림을 사용하는 것입니다.
std::stringstream ss;
ss << age;
std::cout << name << ss.str() << std::endl;
세 번째 방법은 C 라이브러리 를 사용 sprintf
하거나 snprintf
C 라이브러리에서 사용하는 것 입니다.
char buffer[128];
snprintf(buffer, sizeof(buffer), "%s%d", name.c_str(), age);
std::cout << buffer << std::endl;
다른 포스터는을 사용하도록 제안했습니다 itoa
. 이것은 표준 기능이 아니므로 사용하면 코드를 이식 할 수 없습니다. 이를 지원하지 않는 컴파일러가 있습니다.
sprintf
대답에서 발생하지 않는 것을 본다 snprintf
.
#include <iostream>
#include <sstream>
std::ostringstream o;
o << name << age;
std::cout << o.str();
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
string itos(int i) // convert int to string
{
stringstream s;
s << i;
return s.str();
}
http://www.research.att.com/~bs/bs_faq2.html 에서 뻔뻔스럽게 도난당했습니다 .
s
스택 변수이며 s
invoke 후 메모리가 해제 됩니다 itos
. s
힙에서 할당하고 free
사용 후 바로 할당해야 합니까?
C ++ 11이 있다면를 사용할 수 있습니다 std::to_string
.
예:
std::string name = "John";
int age = 21;
name += std::to_string(age);
std::cout << name;
산출:
John21
name += std::to_string(age + 0LL);
대신에 어떻습니까?
가장 간단한 대답은 sprintf
함수 를 사용하는 것 같습니다.
sprintf(outString,"%s%d",name,age);
이 문제는 여러 가지 방법으로 수행 할 수 있습니다. 두 가지 방법으로 보여 드리겠습니다.
을 사용하여 숫자를 문자열로 변환하십시오 to_string(i)
.
문자열 스트림을 사용합니다.
암호:
#include <string>
#include <sstream>
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
int main() {
string name = "John";
int age = 21;
string answer1 = "";
// Method 1). string s1 = to_string(age).
string s1=to_string(age); // Know the integer get converted into string
// where as we know that concatenation can easily be done using '+' in C++
answer1 = name + s1;
cout << answer1 << endl;
// Method 2). Using string streams
ostringstream s2;
s2 << age;
string s3 = s2.str(); // The str() function will convert a number into a string
string answer2 = ""; // For concatenation of strings.
answer2 = name + s3;
cout << answer2 << endl;
return 0;
}
+
출력 연산자가있는 것을 연결하는 데 사용하려면 다음과 같은 템플릿 버전을 제공 할 수 있습니다 operator+
.
template <typename L, typename R> std::string operator+(L left, R right) {
std::ostringstream os;
os << left << right;
return os.str();
}
그런 다음 연결을 간단하게 작성할 수 있습니다.
std::string foo("the answer is ");
int i = 42;
std::string bar(foo + i);
std::cout << bar << std::endl;
산출:
the answer is 42
이것은 가장 효율적인 방법은 아니지만 루프 내에서 많은 연결을 수행하지 않는 한 가장 효율적인 방법은 필요하지 않습니다.
std::string
하므로 문자열을 필요한 유형으로 변환 할 수없는 표현식의 후보가되지 않습니다. 예,이 operator+
사용 할 자격이 없습니다 +
에서 int x = 5 + 7;
. 고려해야 할 모든 것, 나는 매우 설득력있는 이유 없이 이와 같은 연산자를 정의하지 않을 것이지만, 나의 목표는 다른 사람들과 다른 답변을 제공하는 것이 었습니다.
std :: ostringstream은 좋은 방법이지만 때로는이 추가 트릭으로 서식을 단일 라이너로 쉽게 변환 할 수 있습니다.
#include <sstream>
#define MAKE_STRING(tokens) /****************/ \
static_cast<std::ostringstream&>( \
std::ostringstream().flush() << tokens \
).str() \
/**/
이제 다음과 같이 문자열 형식을 지정할 수 있습니다.
int main() {
int i = 123;
std::string message = MAKE_STRING("i = " << i);
std::cout << message << std::endl; // prints: "i = 123"
}
Qt 관련 질문이이 질문에 찬성하여 종료되었으므로 다음은 Qt를 사용하여 수행하는 방법입니다.
QString string = QString("Some string %1 with an int somewhere").arg(someIntVariable);
string.append(someOtherIntVariable);
문자열 변수는 이제 % 1 대신에 someIntVariable의 값을 가지며 마지막에 someOtherIntVariable의 값을 갖습니다.
정수 (또는 다른 숫자 객체)를 문자열과 연결하는 데 사용할 수있는 옵션이 더 있습니다. 그것은이다 Boost.Format
#include <boost/format.hpp>
#include <string>
int main()
{
using boost::format;
int age = 22;
std::string str_age = str(format("age is %1%") % age);
}
그리고 Boost.Spirit (v2)의 카르마
#include <boost/spirit/include/karma.hpp>
#include <iterator>
#include <string>
int main()
{
using namespace boost::spirit;
int age = 22;
std::string str_age("age is ");
std::back_insert_iterator<std::string> sink(str_age);
karma::generate(sink, int_, age);
return 0;
}
다음은 IOStreams 라이브러리에서 구문 분석 및 형식 지정 패싯을 사용하여 문자열에 int를 추가하는 방법의 구현입니다.
#include <iostream>
#include <locale>
#include <string>
template <class Facet>
struct erasable_facet : Facet
{
erasable_facet() : Facet(1) { }
~erasable_facet() { }
};
void append_int(std::string& s, int n)
{
erasable_facet<std::num_put<char,
std::back_insert_iterator<std::string>>> facet;
std::ios str(nullptr);
facet.put(std::back_inserter(s), str,
str.fill(), static_cast<unsigned long>(n));
}
int main()
{
std::string str = "ID: ";
int id = 123;
append_int(str, id);
std::cout << str; // ID: 123
}
#include <sstream> std::ostringstream s; s << "John " << age; std::string query(s.str());
std::string query("John " + std::to_string(age));
#include <boost/lexical_cast.hpp> std::string query("John " + boost::lexical_cast<std::string>(age));
내가 작성한 함수가 있는데, int 숫자를 매개 변수로 사용하여 문자열 리터럴로 변환합니다. 이 함수는 한 자릿수를 해당 문자로 변환하는 다른 함수에 종속됩니다.
char intToChar(int num)
{
if (num < 10 && num >= 0)
{
return num + 48;
//48 is the number that we add to an integer number to have its character equivalent (see the unsigned ASCII table)
}
else
{
return '*';
}
}
string intToString(int num)
{
int digits = 0, process, single;
string numString;
process = num;
// The following process the number of digits in num
while (process != 0)
{
single = process % 10; // 'single' now holds the rightmost portion of the int
process = (process - single)/10;
// Take out the rightmost number of the int (it's a zero in this portion of the int), then divide it by 10
// The above combination eliminates the rightmost portion of the int
digits ++;
}
process = num;
// Fill the numString with '*' times digits
for (int i = 0; i < digits; i++)
{
numString += '*';
}
for (int i = digits-1; i >= 0; i--)
{
single = process % 10;
numString[i] = intToChar ( single);
process = (process - single) / 10;
}
return numString;
}
와 {FMT} 라이브러리 :
auto result = fmt::format("{}{}", name, age);
라이브러리의 하위 집합은 P0645 텍스트 형식 으로 표준화를 위해 제안 되었으며, 허용되는 경우 위와 같이됩니다.
auto result = std::format("{}{}", name, age);
면책 조항 : 저는 {fmt} 라이브러리의 저자입니다.
Boost::lexical_cast
,std::stringstream
,std::strstream
(사용되지 않은), 및sprintf
대snprintf
.