Chuyển đổi một int thành std :: chuỗi


143

Cách ngắn nhất, tốt nhất là có khả năng nội tuyến, để chuyển đổi một int thành một chuỗi là gì? Câu trả lời sử dụng stl và boost sẽ được hoan nghênh.



63
Trong C ++ 11, bạn có thể sử dụng to_stringlikestd::string s = std::to_string(42)

5
C ++ 11 và to_ chuỗi sống lâu! :)
augustin

Câu trả lời:


350

Bạn có thể sử dụng std :: to_opes trong C ++ 11

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

4
std :: to_opes () không hoạt động trong MinGW, nếu có ai quan tâm.
Archie

3
@bparker Phải, nó đã được sửa trong gcc 4.8.0 Tôi đoán vậy. MinGW sắp ra mắt với Code :: Blocks (13.12) mới nhất vẫn có gcc 4.7.1.
Archie

47
#include <sstream>
#include <string>
const int i = 3;
std::ostringstream s;
s << i;
const std::string i_as_string(s.str());

36

boost::lexical_cast<std::string>(yourint) từ boost/lexical_cast.hpp

Làm việc cho tất cả mọi thứ với hỗ trợ std :: Ostream, nhưng không nhanh như, chẳng hạn, itoa

Nó thậm chí dường như nhanh hơn chuỗi dòng hoặc scanf:


15
Boost là bạn của bạn, nếu không có cách đơn giản nào để thực hiện điều này trong Standard C ++ ... Tất nhiên tôi thích những gì lexical_castmang lại, nhưng cảm thấy Boost là quá mức cần thiết cho loại nhiệm vụ này ...
rubenvb

2
Quá mức cần thiết? Dựa trên cái gì? boost.org/doc/libs/1_53_0/doc/html/boost_lexical_cast/ ích
Catskul

Nên xem xét đối tượng của bạn nếu họ không thể sử dụng Boost
Damian

5
"Câu trả lời sử dụng stl và boost sẽ được hoan nghênh." - Khán giả đã cân nhắc
Conrad Jones

30

Cách tốt để làm điều đó là sử dụng toán tử luồng:

#include <sstream>

std::ostringstream s;
int i;

s << i;

std::string converted(s.str());

Tất nhiên bạn có thể khái quát nó cho bất kỳ loại nào bằng cách sử dụng chức năng mẫu ^^

#include <sstream>

template<typename T>
std::string toString(const T& value)
{
    std::ostringstream oss;
    oss << value;
    return oss.str();
}

1
Lưu ý: điều này đòi hỏi #include <sstream>.
TechNyquist

@TechNyquist: Bạn nói đúng. Không có nghĩa là có thể biên dịch, nhưng thay đổi!
thần kinh

1
Vì vậy, bạn không có nghĩa là nó có thể biên dịch được, nhưng thực sự bao gồm nó là :)
TechNyquist

1
@TechNyquist: Có, với một số người std::;)
neuro

16

Nếu bạn không thể sử dụng std::to_stringtừ C ++ 11, bạn có thể viết nó như được định nghĩa trên cppreference.com:

std::string to_string( int value ) Chuyển đổi một số nguyên thập phân đã ký thành một chuỗi có cùng nội dung như những gì std::sprintf(buf, "%d", value)sẽ tạo ra cho buf đủ lớn.

Thực hiện

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

Bạn có thể làm nhiều hơn với nó. Chỉ cần sử dụng "%g"để chuyển đổi float hoặc double thành chuỗi, sử dụng "%x"để chuyển đổi biểu diễn int thành hex, v.v.


14

Hàm không chuẩn, nhưng được thực hiện trên hầu hết các trình biên dịch phổ biến:

int input = MY_VALUE;
char buffer[100] = {0};
int number_base = 10;
std::string output = itoa(input, buffer, number_base);

Cập nhật

C ++ 11 đã giới thiệu một số std::to_stringtình trạng quá tải (lưu ý rằng nó mặc định là cơ sở 10).


3
@DevSolar: Bạn nên giải thích. Ví dụ boost đã được đưa ra. Giải pháp này có sẵn trên hầu hết các trình biên dịch khi boost không được cài đặt (hoặc các yêu cầu của bạn cấm bạn sử dụng nó vì bất kỳ lý do gì). Công ostreamviệc cũng vậy, cho đến khi bạn cần lưu chuỗi số dưới dạng một thứ gì đó ngoài định dạng nhị phân, bát phân hoặc hex (ví dụ: cơ sở-32).
Zac Howland

3
Tôi không thích nó khi các chức năng không chuẩn như itoa()hoặc stricmp()được đưa ra làm câu trả lời cho bất cứ điều gì .
DevSolar

6
Xin lỗi đã xúc phạm sự nhạy cảm của bạn, nhưng tôi đã nói rằng đó là một chức năng không chuẩn trong câu đầu tiên. Tôi đã không đề cập đến nó, nhưng sprintfcũng có thể hoàn thành mục tiêu của OP (mặc dù vẫn phải chịu sự thiếu linh hoạt nếu cần bất cứ thứ gì ngoài số cơ sở chung là cần thiết).
Zac Howland

1
Có bạn đã nói rõ, và tôi đã không đánh giá thấp câu trả lời của bạn, ngay cả khi tôi cảm thấy như vậy. Vì vậy, tôi nghĩ rằng chúng tôi thậm chí. ;-)
DevSolar

8

Macro sau không hoàn toàn nhỏ gọn như sử dụng một lần ostringstreamhoặc boost::lexical_cast.

Nhưng nếu bạn cần lặp lại chuyển đổi thành chuỗi trong mã của mình, macro này được sử dụng thanh lịch hơn so với xử lý trực tiếp các chuỗi chuỗi hoặc truyền rõ ràng mỗi lần.

Nó cũng rất linh hoạt, vì nó chuyển đổi mọi thứ được hỗ trợ operator<<(), thậm chí kết hợp.

Định nghĩa:

#include <sstream>

#define SSTR( x ) dynamic_cast< std::ostringstream & >( \
            ( std::ostringstream() << std::dec << x ) ).str()

Giải trình:

Đây std::declà một cách không có tác dụng phụ để biến ẩn danh ostringstreamthành chung chung ostreamđể operator<<()tra cứu chức năng hoạt động chính xác cho tất cả các loại. (Bạn sẽ gặp rắc rối nếu không, đối số đầu tiên là loại con trỏ.)

Kiểu dynamic_casttrả về kiểu để ostringstreambạn có thể gọi str()nó.

Sử dụng:

#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: Bạn cho tôi biết cách biến mẫu này thành mẫu và tôi sẽ cập nhật tất cả các dự án C ++ mà tôi đã sử dụng cấu trúc này.
DevSolar

@rubenvb: Xin lỗi, điều đó không rõ ràng như lẽ ra phải có. Tôi không thấy cách nào tôi có thể biến mẫu này thành mẫu (sử dụng C ++ 98) mà không mất khả năng đầu ra chuỗi daisy (như trong ví dụ thứ hai của tôi) hoặc phải xử lý một mớ hỗn độn để xử lý bất kỳ số lượng tham số và loại tham số.
DevSolar

@DevSolar: sẽ không inline template<class T> std::string SSTR( T x ) { return dynamic_cast< std::ostringstream & >( (std::ostringstream() << std::dec << x) ).str() }làm gì? (Chưa được thử nghiệm, nhưng tôi tự hỏi điều gì sẽ xảy ra và tại sao?
rubenvb

@rubenvb: Nó sẽ làm cho một cá nhân int(ví dụ đầu tiên của tôi). Nhưng mà không ostreamnhìn thấy được bằng trình biên dịch trong main(vì nó được ẩn bên trong mẫu chức năng), nó sẽ cố gắng tìm kiếm operator<<()cho const char []trong ví dụ thứ hai của tôi - mà sẽ croak. Tôi biết OP chỉ yêu cầu một int, nhưng macro chung chung này rất hữu ích (và thực sự khá phổ biến) mà tôi nghĩ tôi sẽ đưa nó vào đây.
DevSolar

Đối với tính linh hoạt tôi thích một chức năng mẫu. Đối với chuỗi daisy có lẽ có thể được xử lý trong cùng chức năng với một chút RTTI ...
neuro

2

Bạn có thể sử dụng chức năng này để chuyển đổi intsang std::stringsau khi bao gồm <sstream>:

#include <sstream>

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


-2
#include <string>
#include <stdlib.h>

Đây là một cách dễ dàng khác để chuyển đổi int thành chuỗi

int n = random(65,90);
std::string str1=(__String::createWithFormat("%c",n)->getCString());

bạn có thể truy cập liên kết này để biết thêm các phương thức https://www.geekforgeek.org/what-is-the-best-way-in-c-to-convert-a-number-to-a-opes/


phải bao gồm các mục sau để sử dụng các tệp tiêu đề phương thức này #include <string> #include <stdlib.h>
Vipul Dungranee

-3

Giả sử tôi có integer = 0123456789101112. Bây giờ, số nguyên này có thể được chuyển đổi thành một chuỗi bởi stringstreamlớp.

Đây là đoạn mã trong 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;

    }

không giống nhau nhưng câu trả lời đầy đủ hơn đã được đưa ra nhiều năm trước?
Walter

Vâng, nhưng câu trả lời này là hoàn hảo tôi nghĩ vì tôi đã không nhận được bất kỳ câu trả lời hiệu quả từ trước.
Khăn choàng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.