2008-09-15 26 views
123
int i = 4; 
string text = "Player "; 
cout << (text + i); 

Tôi muốn in Player 4.Làm thế nào để bạn thêm một int vào một chuỗi trong C++?

Ở trên rõ ràng là sai nhưng nó cho thấy những gì tôi đang cố gắng làm ở đây. Có cách nào dễ dàng để làm điều này hay tôi phải bắt đầu thêm mới bao gồm?

+0

Ha, bạn nên sử dụng một trong số đó! – jjnguy

+5

Ngoài ra, từ bên phải ở đây là 'ghép/nối thêm một số nguyên vào một chuỗi' – Gishu

+0

bạn có thể nối thêm vào chuỗi ký tự bằng chữ số .. – user2971569

Trả lời

1
cout << text << i; 
6
cout << text << " " << i << endl; 
0
cout << text << i; 

Các << điều hành cho ostream trả về một tham chiếu đến ostream, vì vậy bạn chỉ có thể giữ cho loạt các << hoạt động. Đó là, ở trên là cơ bản giống như:

cout << text; 
cout << i; 
0
cout << text << " " << i << endl; 
9

Đối với hồ sơ, bạn cũng có thể sử dụng một std::stringstream nếu bạn muốn tạo ra các chuỗi trước khi nó thực sự ra.

18

công việc này cho các chuỗi chung (trong trường hợp bạn không muốn xuất ra tệp/bảng điều khiển, nhưng lưu trữ để sử dụng sau này hoặc một cái gì đó).

boost.lexical_cast

MyStr += boost::lexical_cast<std::string>(MyInt); 

chuỗi suối

//sstream.h 
std::stringstream Stream; 
Stream.str(MyStr); 
Stream << MyInt; 
MyStr = Stream.str(); 

//if you're using a stream (eg cout), rather than std::string 
someStream << MyInt; 
+0

Cảm ơn một bó, Im làm việc với Edit Fields trong Win32 và cần biết cách thêm một int với danh hiệu của họ, đây là một trợ giúp tuyệt vời. – moonbeamer2234

109
printf("Player %d", i); 

(downvote câu trả lời của tôi tất cả các bạn thích, tôi vẫn ghét các nhà khai thác C++ IO.)

:-P

+27

-1 không hữu ích chút nào ... –

+14

Vấn đề của câu trả lời là, nó "In" chuỗi và int, điều này không nối thêm nó và trong C++ bạn có thể muốn xuất giá trị vào luồng khác với "cout" , không thể với printf. – Kyborek

+4

@Kyborek - Tôi đã trả lời câu hỏi theo cùng một thuật ngữ mà nó được hỏi. Nếu bạn thực sự muốn chắp thêm thay vì in, thì cũng có một bộ thư viện chức năng chuẩn để thực hiện điều đó. Xem ví dụ 'sprintf' và các biến thể an toàn của nó (http://msdn.microsoft.com/en-us/library/vstudio/ybk95axf.aspx). – Eric

182

Vâng, nếu bạn sử dụng cout bạn chỉ có thể viết các số nguyên trực tiếp với nó, như trong

std::cout << text << i; 

C++ cách chuyển đổi tất cả các loại của các đối tượng thành các chuỗi là thông qua string streams. Nếu bạn không có một tiện dụng, chỉ cần tạo một cái.

#include <sstream> 

std::ostringstream oss; 
oss << text << i; 
std::cout << oss.str(); 

Hoặc, bạn chỉ có thể chuyển đổi số nguyên và nối thêm số nguyên vào chuỗi.

oss << i; 
text += oss.str(); 

Cuối cùng, thư viện Boost cung cấp boost::lexical_cast, kết thúc tốt đẹp xung quanh việc chuyển đổi chuỗi với cú pháp như phôi được tích hợp sẵn.

#include <boost/lexical_cast.hpp> 

text += boost::lexical_cast<std::string>(i); 

Điều này cũng hoạt động theo cách khác, tức là phân tích chuỗi.

-1

Có một vài tùy chọn và tùy chọn nào bạn muốn tùy thuộc vào ngữ cảnh.

Cách đơn giản nhất là

std::cout << text << i; 

hoặc nếu bạn muốn điều này trên một dòng đơn

std::cout << text << i << endl; 

Nếu bạn đang viết một chương trình đơn luồng và nếu bạn không gọi mã này rất nhiều (nơi "rất nhiều" là hàng ngàn lần mỗi giây) thì bạn đã hoàn thành.

Nếu bạn đang viết một chương trình đa luồng và nhiều hơn một luồng được ghi vào cout, thì mã đơn giản này có thể khiến bạn gặp rắc rối. Hãy giả sử rằng thư viện đi kèm với trình biên dịch của bạn đã tạo ra chuỗi cout đủ an toàn hơn bất kỳ cuộc gọi nào tới nó sẽ không bị gián đoạn. Bây giờ chúng ta hãy nói rằng một chủ đề đang sử dụng mã này để viết "Người chơi 1" và một người khác đang viết "Người chơi 2". Nếu bạn may mắn, bạn sẽ nhận được như sau:

Player 1 
Player 2 

Nếu bạn không may mắn bạn có thể nhận một cái gì đó như sau

Player Player 2 
1 

Vấn đề là std :: cout < < văn bản < < i < < endl; chuyển thành 3 cuộc gọi hàm. Mã này tương đương như sau:

std::cout << text; 
std::cout << i; 
std::cout << endl; 

Nếu thay vào đó bạn sử dụng printf C-phong cách, và một lần nữa trình biên dịch của bạn được cung cấp một thư viện runtime với chủ đề an toàn hợp lý (mỗi lần gọi hàm là nguyên tử) sau đó đoạn mã sau sẽ làm việc tốt hơn:

printf("Player %d\n", i); 

Có thể thực hiện điều gì đó trong một cuộc gọi hàm cho phép thư viện io cung cấp đồng bộ hóa dưới bìa và bây giờ toàn bộ dòng văn bản của bạn sẽ được ghi nguyên tử.

Đối với các chương trình đơn giản, std :: cout thật tuyệt. Ném đa luồng hoặc các biến chứng khác và printf ít phong cách bắt đầu trông hấp dẫn hơn.

3

Một khả năng khác là Boost.Format:

#include <boost/format.hpp> 
#include <iostream> 
#include <string> 

int main() { 
    int i = 4; 
    std::string text = "Player"; 
    std::cout << boost::format("%1% %2%\n") % text % i; 
} 
2

Đối với hồ sơ, bạn cũng có thể sử dụng QString lớp Qt của:

#include <QtCore/QString> 

int i = 4; 
QString qs = QString("Player %1").arg(i); 
std::cout << qs.toLocal8bit().constData(); // prints "Player 4" 
+2

Chỉ dành cho đầy đủ, tương đương là: std :: cout << qPrintable (qs); – cmannett85

-5

Nếu sử dụng Windows/MFC, và cần chuỗi hơn đầu ra ngay lập tức thử:

int i = 4; 
CString strOutput; 
strOutput.Format("Player %d", i); 
2

Đây là một chuyển đổi/làm việc nhỏ ví dụ ding, với một số mã tôi cần trước đây.

#include <string> 
#include <sstream> 
#include <iostream> 

using namespace std; 

int main(){ 
string str; 
int i = 321; 
std::stringstream ss; 
ss << 123; 
str = "/dev/video"; 
cout << str << endl; 
cout << str << 456 << endl; 
cout << str << i << endl; 
str += ss.str(); 
cout << str << endl; 
} 

đầu ra sẽ là:

/dev/video 
/dev/video456 
/dev/video321 
/dev/video123 

Lưu ý rằng trong hai dòng cuối cùng bạn lưu các chuỗi sửa đổi trước khi nó thực sự in ra, và bạn có thể sử dụng nó sau này nếu cần thiết.

-3

Bạn có thể sử dụng sau đây

int i = 4; 
string text = "Player "; 
text+=(i+'0'); 
cout << (text); 
3

dụ của bạn dường như chỉ ra rằng bạn muốn hiển thị một chuỗi tiếp theo là một số nguyên, trong trường hợp này:

string text = "Player: "; 
int i = 4; 
cout << text << i << endl; 

sẽ hoạt động tốt.

Tuy nhiên, nếu bạn định lưu trữ các địa điểm chuỗi hoặc truyền đi xung quanh và thực hiện việc này thường xuyên, bạn có thể hưởng lợi từ việc quá tải toán tử bổ sung. Tôi chứng minh điều này dưới đây:

#include <sstream> 
#include <iostream> 
using namespace std; 

std::string operator+(std::string const &a, int b) { 
    std::ostringstream oss; 
    oss << a << b; 
    return oss.str(); 
} 

int main() { 
    int i = 4; 
    string text = "Player: "; 
    cout << (text + i) << endl; 
} 

Trong thực tế, bạn có thể sử dụng các mẫu để làm cho cách tiếp cận này mạnh hơn:

template <class T> 
std::string operator+(std::string const &a, const T &b){ 
    std::ostringstream oss; 
    oss << a << b; 
    return oss.str(); 
} 

Bây giờ, miễn là đối tượng b có một đầu ra suối được xác định, bạn có thể thêm nó vào chuỗi của bạn (hoặc ít nhất, một bản sao của chúng).

+1

Làm thế nào để bạn tránh được lỗi biên dịch mà bây giờ với giải pháp templated 'std :: string (" a ") + std :: string (" b ")' là mơ hồ? –

179

Với C++ 11, bạn có thể viết:

int i = 4; 
std::string text = "Player "; 
text += std::to_string(i); 
+16

C++ 11 có rất nhiều cảm ơn rất nhiều. Cảm ơn câu trả lời của bạn, đây là câu trả lời đúng cho mọi người có thể sử dụng C++ 11. – usr1234567

1

Một phương pháp ở đây là trực tiếp in ra nếu nó cần thiết trong vấn đề của bạn.

cout << text << i; 

khác, một trong những phương pháp an toàn nhất là sử dụng

sprintf(count, "%d", i); 

Và sau đó sao chép nó vào "text" chuỗi của bạn.

for(k = 0; *(count + k); k++) 
{ 
    text += count[k]; 
} 

Vì vậy, bạn có chuỗi đầu ra theo yêu cầu của bạn

Để biết thêm về sprintf, hãy làm theo: http://www.cplusplus.com/reference/cstdio/sprintf

1

Cách đơn giản nhất tôi có thể con số này ra như sau ..
Nó sẽ hoạt động như một chuỗi đơn chuỗi. Tôi đang xem xét một mảng chuỗi, vì nó là phức tạp (một chút tương tự sẽ được theo sau với chuỗi). Tôi tạo một mảng tên và nối thêm một số nguyên và char với số nguyên để hiển thị cách dễ dàng thêm một số intký tự vào chuỗi, hy vọng nó sẽ giúp. chiều dài chỉ để đo kích thước của mảng.Nếu bạn đã quen thuộc với lập trình sau đó size_t là số một unsigned int

#include<iostream> 
    #include<string> 
    using namespace std; 
    int main() { 

     string names[] = { "amz","Waq","Mon","Sam","Has","Shak","GBy" }; //simple array 
     int length = sizeof(names)/sizeof(names[0]); //give you size of array 
     int id; 
     string append[7]; //as length is 7 just for sake of storing and printing output 
     for (size_t i = 0; i < length; i++) { 
      id = rand() % 20000 + 2; 
      append[i] = names[i] + to_string(id); 
     } 
     for (size_t i = 0; i < length; i++) { 
      cout << append[i] << endl; 
     } 


} 
+0

Chào mừng bạn đến với StackOverflow! Xin vui lòng, hãy xem xét thêm một chút mô tả vào mã của bạn, ví dụ như, tại sao và nó hoạt động như thế nào. – Aurasphere

+1

Tôi sẽ aurasphere Cảm ơn lời khuyên của các bạn –

+0

Câu hỏi đã được trả lời nhiều lần và đã hơn 7 năm và không ngắn gọn. Mục đích của bạn với mã này, điều gì cũng phá vỡ một tiêu chuẩn tối thiểu làm thế nào để kết thúc một chương trình cpp? 'system (" pause ")' nằm trên một số hệ thống máy tính mơ hồ. Vui lòng xem xét. – Semo

-1

Bạn cũng thử concatenate chơi với std::string::push_back:

Ví dụ với mã của bạn:

int i = 4; 
string text = "Player "; 
text.push_back(i + '0'); 
cout << text; 

Bạn sẽ xem trong bảng điều khiển:

Máy nghe nhạc 4

Các vấn đề liên quan