Как добавить int к строке в C++?

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

Я бы хотел напечатать Player 4.

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

Кроме того, правильное слово здесь - «объединить / добавить целое число в строку».

Gishu 15.09.2008 21:26

вы можете добавлять к строке цифру за цифрой ..

Binier 04.02.2017 18:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
169
2
479 381
20

Ответы 20

cout << "Player" << i ;

cout << text << i;

cout << text << " " << i << endl;

cout << text << i;

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

cout << text;
cout << i;

cout << text << " " << i << endl;

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

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

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 19.04.2013 12:31

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

Eric 24.04.2013 19:29

После комментария Эрика: char cstr[10];sprintf(cstr,"Player %d",i); или char *cstr;asprintf(cstr,"Player %d",i);

tomsmeding 26.12.2013 21:33

Что ж, если вы используете 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);

cmannett85 15.09.2011 17:28

Если вы используете 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") неоднозначна?

Jason Harrison 10.11.2014 00:55

Как это будет работать? Я думал, вам не разрешено перегружать операторы, если у вас нет хотя бы ОДНОГО пользовательского класса?

Jackspicer 28.09.2018 01:49

@JaisonTitus: он компилируется и запускается без предупреждений и ошибок. Если вы можете найти источник своего убеждения, например, стандарт или какой-либо другой документ, в котором говорится, что это запрещено, я буду рад попытаться решить эту проблему.

Richard 28.09.2018 06:28

Ну, я пытался это сделать. По сути, я хотел перегрузить + в строке, чтобы я мог сделать что-то вроде этого foo ("mystring" + val), где val имеет тип int, а foo - void foo (строковое сообщение); Я попытался использовать то, что вы дали, но у меня возникла ошибка компилятора: «добавление int к строке не добавляется к строке». Я не уверен, где я читал, что это не работает для примитивных типов, но аргументация заключалась в том, что если бы это было разрешено, любой заголовок мог бы идеально переопределить функциональность оператора для примитивных типов, вы не знали бы, где это происходит. Я попробую найти ссылку.

Jackspicer 28.09.2018 21:14

@JaisonTitus: Я не уверен, что std::string квалифицируется как примитивный тип, хотя массив char - это. Я точно понимаю, почему это можно считать плохой практикой. Если проблема, о которой вы упомянули, все еще не решена, не стесняйтесь задавать ее как вопрос и размещать здесь ссылку. Я рад взглянуть.

Richard 28.09.2018 22:12

С 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") в некоторых компьютерных системах неоднозначен. Пожалуйста примите к сведению.

Semo 06.01.2016 01:04

Вы также можете объединить номер игрока с std::string::push_back:

Пример с вашим кодом:

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

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

Player 4

это не сработает для целого числа больше 9

hoholee12 27.06.2020 05:25

Другие вопросы по теме