2009-06-03 33 views
42

Làm cách nào để chuyển đổi một số long thành string bằng C++?Làm cách nào để chuyển đổi chuỗi dài thành chuỗi trong C++?

+5

Chỉ cần một chút soi mói ... Tôi sẽ không gọi đây là "đúc". – kbyrd

+1

@ krbyrd bạn có thể cho tôi biết tại sao không? Tôi là một .NETist bản thân mình, c + + vẫn cảm thấy không thoải mái với tôi. :) –

+4

Đồng ý, đây là chuyển đổi và không phải là diễn viên. – ralphtheninja

Trả lời

49

Bạn có thể sử dụng chuỗi.

#include <sstream> 

// ... 
std::string number; 
std::stringstream strstream; 
strstream << 1L; 
strstream >> number; 

Thường có một số hàm C độc quyền trong thư viện chuẩn cho trình biên dịch của bạn. Tôi thích các biến thể "di động" hơn mặc dù.

Cách C để thực hiện điều đó là chạy nước rút, nhưng điều đó không an toàn lắm. Trong một số thư viện có các phiên bản mới như sprintf_s để bảo vệ chống lại tràn bộ đệm.

1

Khám phá std::stringstream.

3
#include <sstream> 


    .... 

    std::stringstream ss; 
    ss << a_long_int; // or any other type 
    std::string result=ss.str(); // use .str() to get a string back 
+1

It's std :: string, not std :: String. – avakar

+0

Cảm ơn bạn - sự cố về ngón tay. –

-1

Cách tôi thường làm là chạy nước rút. Vì vậy, một thời gian dài bạn có thể làm như sau giả định rằng bạn đang ở trên một kiến ​​trúc 32 bit:

char buf[5] = {0}; // one extra byte for null  
sprintf(buf, "%l", var_for_long); 
+1

-1. Trong khi trình biên dịch C++ sẽ biên dịch mã của bạn, nó chắc chắn không nên được gọi là C++. Ngoài ra, tôi nghi ngờ 5 ký tự là đủ. – avakar

+1

Xin đừng ủng hộ chạy nước rút trong ngày và tuổi này. Chúng ta không có đủ bộ đệm khai thác quá mức? Không phải mã này dường như có bất kỳ văn bản nào - nhưng bạn không bao giờ biết mọi thứ thay đổi như thế nào. – philsquared

+1

Phil, bộ đệm sẽ tràn cho bất kỳ số nào trên 10000. – avakar

8
int main() 
{ 
    long mylong = 123456789; 
    string mystring; 
    stringstream mystream; 
    mystream << mylong; 
    mystring = mystream.str(); 
    cout << mystring << "\n"; 
    return 0; 
} 
4

Có một số cách. Đọc The String Formatters of Manor Farm để biết so sánh chuyên sâu.

+0

Đó là một bài viết hay. – Skurmedel

+1

Có. Đây là ít nhất lần thứ ba tôi đã liên kết nó trên SO. 8v) –

22

Vâng, nếu bạn là fan hâm mộ của copy-paste, ở đây nó là:

#include <sstream> 

template <class T> 
inline std::string to_string (const T& t) 
{ 
    std::stringstream ss; 
    ss << t; 
    return ss.str(); 
} 
+0

Bạn đã bỏ lỡ 'template '. – avakar

+0

Cảm ơn, tôi đã cập nhật câu trả lời. –

+0

'nội tuyến 'hiện đang thừa. – avakar

7

Tôi không biết những loại bài tập này, nhưng có lẽ hầu hết các giáo viên không muốn một câu trả lời mà bạn chỉ cần gọi một chức năng hiện có "huyền diệu" (mặc dù đó là cách được đề nghị để làm điều đó), nhưng anh ta muốn xem liệu bạn có thể thực hiện điều này bằng cách của riêng bạn hay không.

Trở lại trong ngày, giáo viên của tôi thường nói "Tôi muốn xem bạn có thể tự mình lập trình không, nếu bạn không tìm thấy nó trong hệ thống". Vâng, làm thế nào sai ông;) ..

Dù sao, nếu giáo viên của bạn là như nhau, đây là cách cứng để làm điều đó ..

std::string LongToString(long value) 
{ 
    std::string output; 
    std::string sign; 

    if(value < 0) 
    { 
    sign + "-"; 
    value = -value; 
    } 

    while(output.empty() || (value > 0)) 
    { 
    output.push_front(value % 10 + '0') 
    value /= 10; 
    } 

    return sign + output; 
} 

Bạn có thể tranh luận rằng việc sử dụng std::string không phải là "cách cứng", nhưng tôi đoán những gì được tính trong agorithm thực tế.

+0

Lần này là tốt để sử dụng các chức năng sẵn sàng. Nhưng cảm ơn ý tưởng gọn gàng này. –

+0

Thật sao? Anh ấy chỉ kiểm tra nếu bạn có thể _find_ một chức năng ở đâu đó? Vâng, thời gian đã thay đổi;) .. – beef2k

+0

@ beef2k Thậm chí tốt hơn - anh ta nhận thấy rằng tôi biết OOP, cảm thấy ấn tượng và không kiểm tra bất cứ điều gì khác. :) –

1

Một trong những điều không được đề cập bởi bất cứ ai cho đến nay, để giúp bạn suy nghĩ về vấn đề này hơn nữa, là những gì định dạng nên một cảnh quay dài khi nó được đúc thành một chuỗi.

Chỉ cần xem qua chương trình spreedsheet (như Calc/Excel). Bạn có muốn nó làm tròn đến triệu gần nhất, với dấu ngoặc nếu nó âm, luôn hiển thị dấu .... Số có thực sự là biểu diễn của cái gì khác không, bạn có nên hiển thị nó trong Oractal hoặc Hex thay thế không?

Câu trả lời cho đến nay đã cho bạn một số kết quả mặc định, nhưng có lẽ không phải là kết quả phù hợp.

+0

Nếu tôi cần điều đó, tôi sẽ chỉnh sửa câu hỏi của mình. :) –

+0

Yêu thích nó, tôi đưa ra một câu trả lời cho câu hỏi để giúp suy nghĩ về bài tập ở nhà hơn là đưa ra câu trả lời đã có và tôi nhận được một câu trả lời, trong khi đó 'std :: stringstream' có một upvote ... –

41

Trong C++ 11, có thực sự std :: to_string và std :: to_wstring chức năng trong < chuỗi >.

string to_string(int val); 
string to_string(long val); 
string to_string(long long val); 
string to_string(unsigned val); 
string to_string(unsigned long val); 
string to_string(unsigned long long val); 
string to_string(float val); 
string to_string(double val); 
string to_string (long double val); 
1

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

long val = 12345; 
std::string my_val = std::to_string(val); 
Các vấn đề liên quan