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

Я бы хотел напечатать Player 4.Как вы добавляете int в строку на C++?

Вышеупомянутое, очевидно, неверно, но оно показывает, что я пытаюсь сделать здесь. Есть ли простой способ сделать это или мне нужно начинать добавлять новые?

+0

Ха, вы можете использовать один из них! – jjnguy

+5

Кроме того, здесь правильное слово 'concatenate/append integer to string' – Gishu

+0

вы можете добавить в строку цифру по цифре. – user2971569

ответ

0
cout << text << i; 

<< оператор ostream возвращает ссылку на ostream, так что вы можете просто держать сцепление в << операции. То есть, выше, в основном так же, как:

cout << text; 
cout << i; 
9

Для записи, вы можете также использовать std::stringstream, если вы хотите создать строку, прежде чем он на самом деле выход.

18

эти работы для общих строк (в случае, если вы не хотите выводить на файл/консоль, но сохраняете для последующего использования или что-то в этом роде).

boost.lexical_cast

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

струна потоков

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

Спасибо, что я работаю с Edit Fields в Win32 и вам нужно знать, как добавить int к их названиям, это было большой помощью. – moonbeamer2234

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

(Downvote мой ответ все, что вам нравится, я до сих пор ненавижу операторы C++ IO.)

:-P

+27

-1 для того, чтобы не быть полезным вообще ... –

+14

Проблема этого ответа заключается в том, что он «печатает» строку и int, это не добавляет ее, а в C++ вы можете вывести значение в другой поток, чем «cout», , что невозможно с помощью printf. – Kyborek

+4

@ Kyborek - Я ответил на вопрос в тех же условиях, что и было задано. Если вы действительно хотите добавить, а не печатать, то для этого также существует набор стандартных библиотек функций. См. Например, 'sprintf' и его безопасные варианты (http://msdn.microsoft.com/en-us/library/vstudio/ybk95axf.aspx). – Eric

182

Ну, если вы используете соиЬ вы можете просто написать целое непосредственно к нему, как и в

std::cout << text << i; 

С ++ способ преобразования всех видов объектов в строки через string streams. Если у вас нет одной удобной, просто создайте ее.

#include <sstream> 

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

В качестве альтернативы вы можете просто преобразовать целое число и добавить его в строку.

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

Наконец, библиотеки Повышения обеспечивают boost::lexical_cast, который оборачивается вокруг преобразования stringstream с синтаксисом встроенного типа отливок.

#include <boost/lexical_cast.hpp> 

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

Это также работает наоборот, то есть для анализа строк.

-1

Существует несколько вариантов, и любой из них зависит от контекста.

Самого простой способ

std::cout << text << i; 

или если вы хотите это на одной линии

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

Если вы пишете однопоточную программу, и если вы не зовете этот код много (где «много» - тысячи раз в секунду), тогда вы закончите.

Если вы пишете многопоточную программу и более одного потока записываете в cout, тогда этот простой код может вызвать у вас проблемы. Предположим, что библиотека, поставляемая вместе с вашим компилятором, сделала поток cout безопасным, чем любой его вызов, не будет прерван. Теперь предположим, что один поток использует этот код для записи «Player 1», а другой - «Player 2». Если вам повезет, вы получите следующее:

Player 1 
Player 2 

Если вам не повезет, вы можете получить что-то вроде следующего

Player Player 2 
1 

Проблема в том, что StD :: соиЬ < < < < тексту я < < endl; превращается в 3 вызова функций. Код эквивалентен следующему:

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

Если вместо этого вы использовали Printf C-стиль, и снова ваш компилятор предоставил библиотеку времени выполнения с разумной безопасностью потока (каждый вызов функции атомный), то следующий код будет работать лучше:

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

Будучи в состоянии сделать что-то в вызове одной функции позволяет ИО библиотеки обеспечивают синхронизацию под одеялом, и теперь вся ваша строка текста будет атомарно написано.

Для простых программ std :: cout отлично. Бросьте многопоточность или другие осложнения, и менее стильный printf начинает выглядеть более привлекательно.

3

Другая возможность 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

Для записи, вы можете также использовать в Qt QString класс:

#include <QtCore/QString> 

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

Просто для полнота, эквивалент: std :: cout << qPrintable (qs); – cmannett85

-5

При использовании Windows/MFC, и нужна строка для более немедленного вывода попробуйте:

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

Здесь небольшое рабочее преобразование/приложение например, с некоторым кодом, который мне нужен раньше.

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

выход будет:

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

Обратите внимание, что в двух последних строках вы сохраните измененную строку, прежде чем он на самом деле распечатаны, и вы можете использовать его позже, если это необходимо.

-3

Вы можете использовать следующие

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

Ваш пример, кажется, указывает, что вы хотели бы, чтобы отобразить строку, за которой следует целое, и в этом случае:

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

будет работать нормально.

Но если вы собираетесь хранить строковые места или передавать их, и часто это делать, вы можете воспользоваться перегрузкой оператора сложения. Я демонстрирую это ниже:

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

В самом деле, вы можете использовать шаблоны, чтобы сделать этот подход более мощным:

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

Теперь, пока объект b имеет определенный выходной поток, вы можете добавить его к вашей строке (или, по крайней мере, к ее копии).

+1

Как вам избежать ошибки компиляции, которая теперь с шаблонизированным решением 'std :: string (" a ") + std :: string (" b ")' неоднозначна? –

179

С C++ 11, вы можете написать:

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

C++ 11 делает так много спасибо, гораздо больше прав. Спасибо за ваш ответ, это правильный ответ для всех, кто может использовать C++ 11. – usr1234567

1

Один метод здесь непосредственно печать выход, если его требуется в вашей проблеме.

cout << text << i; 

Else, один из самых безопасных метода заключается в использовании

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

А затем скопировать его в свой "текст" строки.

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

Таким образом, у вас есть необходимый выходной строки

Для получения дополнительной информации о sprintf следуйте: http://www.cplusplus.com/reference/cstdio/sprintf

1

Самый простой способ я мог понять это выглядит следующим образом ..
Он будет работать как одна строка и строка массив. Я рассматриваю строковый массив, поскольку он сложный (немного будет следовать за строкой). создать массив имен и добавить некоторое целое число и полукокса с ним, чтобы показать, как легко можно добавить некоторые INT и символы в строку, надеюсь, что это помогает. Длина - это просто размер массива.Если вы знакомы с программированием, то size_t это число а БЕЗЗНАКОВЫЙ 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

Добро пожаловать в StackOverflow! Пожалуйста, подумайте над тем, чтобы добавить немного кода к вашему коду, например, почему и как он работает. – Aurasphere

+1

Я буду aurasphere Спасибо за ваш добрый совет –

+0

Вопрос был дан ответ несколько раз и старше 7 лет и не кратким. Каково ваше намерение с этим кодом, который также нарушает минимальный стандарт, как закончить программу cpp? 'system (" pause ")' находится на некоторых компьютерных системах неоднозначно. Пожалуйста примите к сведению. – Semo

-1

Вы также можете попробовать CONCATENATE игрока с std::string::push_back:

Пример с кодом:

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

Вы будете см. в консоли:

Игрок 4

Смежные вопросы