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.
to_string
likestd::string s = std::to_string(42)
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.
to_string
likestd::string s = std::to_string(42)
Câu trả lời:
Bạn có thể sử dụng std :: to_opes trong C ++ 11
int i = 3;
std::string str = std::to_string(i);
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:
lexical_cast
mang 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 ...
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();
}
#include <sstream>
.
std::
;)
Nếu bạn không thể sử dụng std::to_string
từ 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.
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_string
tình trạng quá tải (lưu ý rằng nó mặc định là cơ sở 10).
ostream
việ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).
itoa()
hoặc stricmp()
được đưa ra làm câu trả lời cho bất cứ điều gì .
sprintf
cũ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).
Macro sau không hoàn toàn nhỏ gọn như sử dụng một lần ostringstream
hoặ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::dec
là một cách không có tác dụng phụ để biến ẩn danh ostringstream
thà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_cast
trả về kiểu để ostringstream
bạ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;
}
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?
int
(ví dụ đầu tiên của tôi). Nhưng mà không ostream
nhì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.
Bạn có thể bao gồm việc thực hiện itoa trong dự án của bạn.
Đây là itoa được sửa đổi để hoạt động với std :: string: http://www.strudel.org.uk/itoa/
#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/
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 stringstream
lớ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;
}