เป็นวิธีที่สั้นที่สุดโดยเฉพาะอย่างยิ่งแบบอินไลน์สามารถแปลง int เป็นสตริงได้อย่างไร คำตอบที่ใช้ stl และเพิ่มจะได้รับการต้อนรับ
to_string
likestd::string s = std::to_string(42)
เป็นวิธีที่สั้นที่สุดโดยเฉพาะอย่างยิ่งแบบอินไลน์สามารถแปลง int เป็นสตริงได้อย่างไร คำตอบที่ใช้ stl และเพิ่มจะได้รับการต้อนรับ
to_string
likestd::string s = std::to_string(42)
คำตอบ:
คุณสามารถใช้std :: to_stringใน C ++ 11
int i = 3;
std::string str = std::to_string(i);
#include <sstream>
#include <string>
const int i = 3;
std::ostringstream s;
s << i;
const std::string i_as_string(s.str());
boost::lexical_cast<std::string>(yourint)
จาก boost/lexical_cast.hpp
ทำงานได้กับทุกสิ่งด้วย std :: ostream support แต่ไม่เร็วอย่างเช่น itoa
ดูเหมือนว่าจะเร็วกว่า stringstream หรือ scanf:
lexical_cast
จะนำมา แต่รู้สึกว่า Boost นั้น
ด้วยวิธีการที่รู้จักกันดีในการใช้ตัวดำเนินการกระแสข้อมูล:
#include <sstream>
std::ostringstream s;
int i;
s << i;
std::string converted(s.str());
แน่นอนว่าคุณสามารถทำให้เป็นมาตรฐานสำหรับประเภทใดก็ได้โดยใช้ฟังก์ชั่นเทมเพลต ^^
#include <sstream>
template<typename T>
std::string toString(const T& value)
{
std::ostringstream oss;
oss << value;
return oss.str();
}
#include <sstream>
นี้ต้อง
std::
;)
หากคุณไม่สามารถใช้std::to_string
จาก C ++ 11 คุณสามารถเขียนได้ตามที่กำหนดไว้ใน cppreference.com:
std::string to_string( int value )
แปลงเลขจำนวนเต็มฐานสิบที่ได้รับการเซ็นชื่อให้เป็นสตริงที่มีเนื้อหาเหมือนกับสิ่งที่std::sprintf(buf, "%d", value)
จะสร้างให้กับ buf ขนาดใหญ่ที่เพียงพอ
การดำเนินงาน
#include <cstdio>
#include <string>
#include <cassert>
std::string to_string( int x ) {
int length = snprintf( NULL, 0, "%d", x );
assert( length >= 0 );
char* buf = new char[length + 1];
snprintf( buf, length + 1, "%d", x );
std::string str( buf );
delete[] buf;
return str;
}
คุณสามารถทำอะไรได้มากกว่านี้ เพียงแค่ใช้"%g"
ในการแปลง float หรือ double เป็น string ใช้"%x"
ในการแปลง int เป็นการแสดง hex และอื่น ๆ
ฟังก์ชั่นที่ไม่ได้มาตรฐาน แต่ถูกนำไปใช้กับคอมไพเลอร์ส่วนใหญ่
int input = MY_VALUE;
char buffer[100] = {0};
int number_base = 10;
std::string output = itoa(input, buffer, number_base);
ปรับปรุง
C ++ 11 แนะนำการstd::to_string
โอเวอร์โหลดหลายครั้ง(โปรดทราบว่ามันเป็นค่าเริ่มต้นที่ฐาน 10)
ostream
ทำงานเช่นกันจนกว่าคุณจะต้องบันทึกหมายเลขสตริงเป็นสิ่งอื่นนอกเหนือจากรูปแบบไบนารีฐานแปดหรือฐานสิบหก (เช่นฐาน -32)
itoa()
หรือstricmp()
จะได้รับเป็นคำตอบอะไร
sprintf
ยังสามารถบรรลุเป้าหมายของ OP (แม้ว่าจะยังคงมีปัญหาจากการขาดความยืดหยุ่นหากจำเป็นต้องใช้สิ่งอื่นนอกเหนือจากหมายเลขฐานทั่วไป)
แมโครต่อไปนี้มีขนาดค่อนข้างกะทัดรัดไม่ใช้งานเพียงครั้งเดียวostringstream
หรือboost::lexical_cast
หรือ
แต่ถ้าคุณต้องการแปลงเป็นสตริงในรหัสของคุณซ้ำ ๆ มาโครนี้มีความสง่างามกว่าการใช้งานมากกว่าจัดการสตริงสสตรีมหรือการคัดเลือกนักแสดงอย่างชัดเจนทุกครั้ง
นอกจากนี้ยังมีประโยชน์อย่างมากเนื่องจากแปลงทุกอย่างที่รองรับoperator<<()
แม้จะอยู่รวมกัน
ความหมาย:
#include <sstream>
#define SSTR( x ) dynamic_cast< std::ostringstream & >( \
( std::ostringstream() << std::dec << x ) ).str()
คำอธิบาย:
วิธีstd::dec
นี้เป็นวิธีที่ไม่มีผลข้างเคียงในการทำให้ไม่ระบุชื่อostringstream
เป็นแบบทั่วไปostream
ดังนั้นoperator<<()
การค้นหาฟังก์ชั่นจะทำงานได้อย่างถูกต้องสำหรับทุกประเภท (คุณมีปัญหามิฉะนั้นถ้าอาร์กิวเมนต์แรกเป็นประเภทตัวชี้)
dynamic_cast
ผลตอบแทนประเภทกลับไปostringstream
เพื่อให้คุณสามารถโทรหาstr()
มัน
ใช้:
#include <string>
int main()
{
int i = 42;
std::string s1 = SSTR( i );
int x = 23;
std::string s2 = SSTR( "i: " << i << ", x: " << x );
return 0;
}
inline template<class T> std::string SSTR( T x ) { return dynamic_cast< std::ostringstream & >( (std::ostringstream() << std::dec << x) ).str() }
ทำอย่างไร (ยังไม่ได้ทดสอบ แต่ฉันสงสัยว่าจะเกิดอะไรขึ้นและทำไม
int
(ตัวอย่างแรกของฉัน) แต่ไม่ostream
สามารถมองเห็นได้คอมไพเลอร์ในmain
(ตามที่มันถูกซ่อนอยู่ภายในฟังก์ชันแม่แบบ) ก็จะพยายามที่จะมองขึ้นoperator<<()
สำหรับconst char []
ในตัวอย่างที่สองของฉัน - ซึ่งจะบ่น ฉันรู้ว่า OP ขอเพียงตัวเดียวint
แต่มาโครที่ธรรมดากว่านี้มีประโยชน์มาก (และค่อนข้างแพร่หลายมาก) ที่ฉันคิดว่าฉันจะรวมไว้ที่นี่
คุณสามารถใช้ฟังก์ชันนี้เพื่อแปลงint
เป็นstd::string
หลังจากรวมถึง<sstream>
:
#include <sstream>
string IntToString (int a)
{
stringstream temp;
temp<<a;
return temp.str();
}
คุณอาจรวมถึงการใช้ itoa ในโครงการของคุณ
นี่คือ itoa ที่แก้ไขเพื่อให้ทำงานกับ std :: string: http://www.strudel.org.uk/itoa/
#include <string>
#include <stdlib.h>
นี่เป็นอีกวิธีที่ง่ายในการแปลง int เป็นสายอักขระ
int n = random(65,90);
std::string str1=(__String::createWithFormat("%c",n)->getCString());
คุณสามารถเยี่ยมชมลิงค์นี้สำหรับวิธีการเพิ่มเติม https://www.geeksforgeeks.org/what-is-the-the-best-way-in-c-to-convert-a-number-to-a-string/
integer = 0123456789101112
สมมติว่าฉันมี ตอนนี้จำนวนเต็มนี้สามารถแปลงเป็นสตริงโดยstringstream
ชั้นเรียน
นี่คือรหัสใน C ++:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,i;
string s;
stringstream st;
for(i=0;i<=12;i++)
{
st<<i;
}
s=st.str();
cout<<s<<endl;
return 0;
}