การแปลงสตริง int เป็น std ::


143

เป็นวิธีที่สั้นที่สุดโดยเฉพาะอย่างยิ่งแบบอินไลน์สามารถแปลง int เป็นสตริงได้อย่างไร คำตอบที่ใช้ stl และเพิ่มจะได้รับการต้อนรับ



63
ใน C ++ 11 คุณสามารถใช้to_stringlikestd::string s = std::to_string(42)

5
ลองใช้ C ++ 11 และ to_string แบบสดๆ! :)
กัสติน

คำตอบ:


351

คุณสามารถใช้std :: to_stringใน C ++ 11

int i = 3;
std::string str = std::to_string(i);

4
std :: to_string () ไม่ทำงานใน MinGW หากใครสนใจ
Archie

3
@bparker ถูกต้องได้รับการแก้ไขใน gcc 4.8.0 ฉันเดาว่า MinGW มาพร้อมกับรหัสล่าสุด :: บล็อก (13.12) ยังคงมี gcc 4.7.1
Archie


36

boost::lexical_cast<std::string>(yourint) จาก boost/lexical_cast.hpp

ทำงานได้กับทุกสิ่งด้วย std :: ostream support แต่ไม่เร็วอย่างเช่น itoa

ดูเหมือนว่าจะเร็วกว่า stringstream หรือ scanf:


15
Boost เป็นเพื่อนของคุณหากไม่มีวิธีง่ายๆในการทำเช่นนี้ใน Standard C ++ ... แน่นอนว่าฉันชอบอะไรที่lexical_castจะนำมา แต่รู้สึกว่า Boost นั้น
เก่ง

2
Overkill? ขึ้นอยู่กับอะไร boost.org/doc/libs/1_53_0/doc/html/boost_lexical_cast/ …
Catskul

ควรพิจารณาผู้ชมของคุณหากพวกเขาไม่สามารถใช้ Boost
Damian

5
"คำตอบที่ใช้ stl และ boost จะได้รับการต้อนรับ" - ผู้ชมพิจารณาแล้ว
Conrad Jones

30

ด้วยวิธีการที่รู้จักกันดีในการใช้ตัวดำเนินการกระแสข้อมูล:

#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();
}

1
หมายเหตุ: #include <sstream>นี้ต้อง
TechNyquist

@TechNyquist: ถูกต้อง ไม่ได้หมายถึงการคอมไพล์ แต่เปลี่ยน!
ประสาท

1
ดังนั้นคุณไม่ได้ตั้งใจให้คอมไพล์ได้ แต่จริงๆแล้วมันรวมเอาไว้ด้วย :)
TechNyquist

1
@TechNyquist: ใช่ด้วยstd::;)
neuro

16

หากคุณไม่สามารถใช้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 และอื่น ๆ


14

ฟังก์ชั่นที่ไม่ได้มาตรฐาน แต่ถูกนำไปใช้กับคอมไพเลอร์ส่วนใหญ่

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)


3
@DevSolar: คุณควรทำอย่างละเอียด ตัวอย่างการเพิ่มได้รับมาแล้ว โซลูชันนี้มีให้ในคอมไพเลอร์ส่วนใหญ่เมื่อไม่ได้ติดตั้งบูสเตอร์ (หรือข้อกำหนดของคุณห้ามมิให้คุณใช้งานไม่ว่าด้วยเหตุผลใดก็ตาม) การostreamทำงานเช่นกันจนกว่าคุณจะต้องบันทึกหมายเลขสตริงเป็นสิ่งอื่นนอกเหนือจากรูปแบบไบนารีฐานแปดหรือฐานสิบหก (เช่นฐาน -32)
Zac Howland

3
ฉันไม่ชอบมันเมื่อฟังก์ชั่นที่ไม่ได้มาตรฐานชอบitoa()หรือstricmp()จะได้รับเป็นคำตอบอะไร
DevSolar

6
ขออภัยที่ทำให้คุณอ่อนไหว แต่ฉันได้กล่าวว่ามันเป็นฟังก์ชั่นที่ไม่ได้มาตรฐานในประโยคแรก ฉันไม่ได้พูดถึงมัน แต่sprintfยังสามารถบรรลุเป้าหมายของ OP (แม้ว่าจะยังคงมีปัญหาจากการขาดความยืดหยุ่นหากจำเป็นต้องใช้สิ่งอื่นนอกเหนือจากหมายเลขฐานทั่วไป)
Zac Howland

1
ใช่คุณทำมันและฉันไม่ได้ลงคะแนนคำตอบของคุณแม้ว่ามันจะทำให้ฉันทำ ดังนั้นฉันคิดว่าเรายัง ;-)
DevSolar

8

แมโครต่อไปนี้มีขนาดค่อนข้างกะทัดรัดไม่ใช้งานเพียงครั้งเดียว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;
}

1
@rubenvb: คุณบอกฉันว่าจะทำให้สิ่งนี้กลายเป็นเทมเพลตได้อย่างไรและฉันจะอัปเดตโครงการ C ++ ทั้งหมดที่ฉันใช้งานโครงสร้างนี้มาแล้ว
DevSolar

@rubenvb: ขออภัยนั่นไม่ชัดเจนเท่าที่ควร ฉันไม่เห็นวิธีที่ฉันสามารถเปลี่ยนเป็นเทมเพลต (ใช้ C ++ 98) โดยไม่สูญเสียความสามารถในการส่งออก daisy-chain (เช่นในตัวอย่างที่สองของฉัน) หรือต้องมีระเบียบที่ซับซ้อนเพื่อจัดการ จำนวนพารามิเตอร์และประเภทพารามิเตอร์ใด ๆ
DevSolar

@DevSolar: จะไม่inline template<class T> std::string SSTR( T x ) { return dynamic_cast< std::ostringstream & >( (std::ostringstream() << std::dec << x) ).str() }ทำอย่างไร (ยังไม่ได้ทดสอบ แต่ฉันสงสัยว่าจะเกิดอะไรขึ้นและทำไม
rubenvb

@rubenvb: มันจะทำเพื่อบุคคลint(ตัวอย่างแรกของฉัน) แต่ไม่ostreamสามารถมองเห็นได้คอมไพเลอร์ในmain(ตามที่มันถูกซ่อนอยู่ภายในฟังก์ชันแม่แบบ) ก็จะพยายามที่จะมองขึ้นoperator<<()สำหรับconst char []ในตัวอย่างที่สองของฉัน - ซึ่งจะบ่น ฉันรู้ว่า OP ขอเพียงตัวเดียวintแต่มาโครที่ธรรมดากว่านี้มีประโยชน์มาก (และค่อนข้างแพร่หลายมาก) ที่ฉันคิดว่าฉันจะรวมไว้ที่นี่
DevSolar

สำหรับความเก่งกาจฉันชอบฟังก์ชั่นเทมเพลต สำหรับ daisy-chain บางทีที่สามารถจัดการได้ในฟังก์ชั่นเดียวกันกับบิตของ RTTI ...
46980 neuro ประสาท

2

คุณสามารถใช้ฟังก์ชันนี้เพื่อแปลงintเป็นstd::stringหลังจากรวมถึง<sstream>:

#include <sstream>

string IntToString (int a)
{
    stringstream temp;
    temp<<a;
    return temp.str();
}


-2
#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/


ต้องรวมต่อไปนี้เพื่อใช้ไฟล์เมธอดส่วนหัว #include <string> #include <stdlib.h>
Vipul Dungranee

-3

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;

    }

ไม่เหมือนกัน แต่มีคำตอบที่สมบูรณ์กว่านี้เมื่อหลายปีก่อน?
วอลเตอร์

ใช่ แต่คำตอบนี้สมบูรณ์แบบฉันคิดว่าฉันไม่ได้รับคำตอบที่มีประสิทธิภาพจากก่อนหน้านี้
Shawon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.