int i = 4;
string text = "Player ";
cout << (text + i);
Я бы хотел напечатать Player 4.
Вышеизложенное явно неверно, но показывает, что я пытаюсь здесь сделать. Есть ли простой способ сделать это или мне нужно начинать добавлять новые включения?
вы можете добавлять к строке цифру за цифрой ..





cout << "Player" << i ;
cout << text << i;
cout << text << " " << i << endl;
cout << text << i;
Оператор << для ostream возвращает ссылку на ostream, поэтому вы можете просто продолжать связывать операции <<. То есть приведенное выше в основном такое же, как:
cout << text;
cout << i;
cout << text << " " << i << endl;
Они работают для общих строк (в случае, если вы не хотите выводить в файл / консоль, а сохранять для дальнейшего использования или что-то в этом роде).
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 (for example, cout), rather than std::string
someStream << MyInt;
printf("Player %d", i);
(Проголосуйте вниз, сколько хотите; я все еще ненавижу операторы ввода-вывода C++.)
:-П
Проблема этого ответа в том, что он «печатает» строку и int, это не добавляет его, и в C++ вы можете захотеть вывести значение в поток, отличный от cout, что невозможно с printf.
@Kyborek - Я ответил на вопрос так же, как он был задан. Если вы действительно хотите добавить, а не печатать, для этого также есть набор стандартной библиотеки функций. См., Например, sprintf и его безопасные варианты (msdn.microsoft.com/en-us/library/vstudio/ybk95axf.aspx).
После комментария Эрика: char cstr[10];sprintf(cstr,"Player %d",i); или char *cstr;asprintf(cstr,"Player %d",i);
Что ж, если вы используете cout, вы можете просто записать целое число прямо в него, как в
std::cout << text << i;
В C++ все типы объектов преобразуются в строки с помощью струнные потоки. Если у вас нет под рукой, просто создайте его.
#include <sstream>
std::ostringstream oss;
oss << text << i;
std::cout << oss.str();
В качестве альтернативы вы можете просто преобразовать целое число и добавить его в строку.
oss << i;
text += oss.str();
Наконец, библиотеки Boost предоставляют boost::lexical_cast, который обертывает преобразование строкового потока с синтаксисом, подобным встроенному приведению типов.
#include <boost/lexical_cast.hpp>
text += boost::lexical_cast<std::string>(i);
Это также работает наоборот, то есть для синтаксического анализа строк.
Есть несколько вариантов, и какой из них вам нужен, зависит от контекста.
Самый простой способ
std::cout << text << i;
или если вы хотите это в одной строке
std::cout << text << i << endl;
Если вы пишете однопоточную программу и не вызываете этот код часто (где «много» - это тысячи раз в секунду), то все готово.
Если вы пишете многопоточную программу и в cout записывает более одного потока, этот простой код может вызвать у вас проблемы. Предположим, что библиотека, поставляемая с вашим компилятором, сделала cout потокобезопасным, поэтому любой ее вызов не будет прерван. Теперь предположим, что один поток использует этот код для записи «Player 1», а другой - «Player 2». Если вам повезет, вы получите следующее:
Player 1
Player 2
Если вам не повезет, вы можете получить что-то вроде следующего
Player Player 2
1
Проблема в том, что std :: cout << text << i << endl; превращается в 3 вызова функций. Код эквивалентен следующему:
std::cout << text;
std::cout << i;
std::cout << endl;
Если вместо этого вы использовали printf в стиле C, и ваш компилятор снова предоставил библиотеку времени выполнения с разумной безопасностью потоков (каждый вызов функции является атомарным), тогда следующий код будет работать лучше:
printf("Player %d\n", i);
Возможность делать что-то в одном вызове функции позволяет библиотеке io обеспечивать синхронизацию изнутри, и теперь вся ваша строка текста будет записана атомарно.
Для простых программ отлично подходит std :: cout. Добавьте сюда многопоточность или другие сложности, и менее стильный printf станет выглядеть более привлекательно.
Другая возможность - 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;
}
Для записи вы также можете использовать класс Qt QString:
#include <QtCore/QString>
int i = 4;
QString qs = QString("Player %1").arg(i);
std::cout << qs.toLocal8bit().constData(); // prints "Player 4"
Для полноты картины эквивалент: std :: cout << qPrintable (qs);
Если вы используете Windows / MFC и вам нужна строка для более чем немедленного вывода, попробуйте:
int i = 4;
CString strOutput;
strOutput.Format("Player %d", i);
Вот небольшой рабочий пример преобразования / добавления с некоторым кодом, который мне нужен раньше.
#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
Обратите внимание, что в последних двух строках вы сохраняете измененную строку до ее фактического вывода на печать, и вы можете использовать ее позже, если это необходимо.
Вы можете использовать следующие
int i = 4;
string text = "Player ";
text+=(i+'0');
cout << (text);
Ваш пример, похоже, указывает на то, что вы хотите отобразить строку, за которой следует целое число, и в этом случае:
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 имеет определенный поток вывода, вы можете добавить его в свою строку (или, по крайней мере, ее копию).
Как это избежать ошибки компиляции, которая теперь с шаблонным решением std::string("a") + std::string("b") неоднозначна?
Как это будет работать? Я думал, вам не разрешено перегружать операторы, если у вас нет хотя бы ОДНОГО пользовательского класса?
@JaisonTitus: он компилируется и запускается без предупреждений и ошибок. Если вы можете найти источник своего убеждения, например, стандарт или какой-либо другой документ, в котором говорится, что это запрещено, я буду рад попытаться решить эту проблему.
Ну, я пытался это сделать. По сути, я хотел перегрузить + в строке, чтобы я мог сделать что-то вроде этого foo ("mystring" + val), где val имеет тип int, а foo - void foo (строковое сообщение); Я попытался использовать то, что вы дали, но у меня возникла ошибка компилятора: «добавление int к строке не добавляется к строке». Я не уверен, где я читал, что это не работает для примитивных типов, но аргументация заключалась в том, что если бы это было разрешено, любой заголовок мог бы идеально переопределить функциональность оператора для примитивных типов, вы не знали бы, где это происходит. Я попробую найти ссылку.
@JaisonTitus: Я не уверен, что std::string квалифицируется как примитивный тип, хотя массив char - это. Я точно понимаю, почему это можно считать плохой практикой. Если проблема, о которой вы упомянули, все еще не решена, не стесняйтесь задавать ее как вопрос и размещать здесь ссылку. Я рад взглянуть.
С C++ 11 вы можете написать:
#include <string> // to use std::string, std::to_string() and "+" operator acting on strings
int i = 4;
std::string text = "Player ";
text += std::to_string(i);
Один из методов здесь - это прямая печать вывода, если это требуется в вашей проблеме.
cout << text << i;
В противном случае один из самых безопасных способов - использовать
sprintf(count, "%d", i);
А затем скопируйте его в свою «текстовую» строку.
for(k = 0; *(count + k); k++)
{
text += count[k];
}
Таким образом, у вас есть требуемая строка вывода
Для получения дополнительной информации о sprintf, следуйте:
http://www.cplusplus.com/reference/cstdio/sprintf
Проще всего понять это следующим образом ..
Он будет работать как одна строка и строковый массив.
Я рассматриваю массив строк, так как он сложен (немного то же самое будет следовать за строкой).
Я создаю массив имен и добавить, некоторое целое число и char, чтобы показать, как легко добавить некоторые int и символы в строку, надеюсь, это поможет.
length просто для измерения размера массива. Если вы знакомы с программированием, то 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;
}
}
На вопрос ответили несколько раз, он старше 7 лет и не является кратким. Каковы ваши намерения в этом коде, который также нарушает минимальный стандарт завершения программы cpp? system("pause") в некоторых компьютерных системах неоднозначен. Пожалуйста примите к сведению.
Вы также можете объединить номер игрока с std::string::push_back:
Пример с вашим кодом:
int i = 4;
string text = "Player ";
text.push_back(i + '0');
cout << text;
В консоли вы увидите:
Player 4
это не сработает для целого числа больше 9
Кроме того, правильное слово здесь - «объединить / добавить целое число в строку».