2010-02-18 5 views
7

Я новичок в C++. Я хочу сделать char*, но я не знаю как.
В Java это просто так:C++: Как построить строки/char *

int player = 0; 
int cpu = 0; 
String s = "You: " + player + " CPU: " + cpu; 

Как я могу это сделать? Мне нужен char*.

Я фокусируюсь на вставке целого числа после строки.

+0

Что именно вы пытаетесь сделать? Вам нужен метод, который принимает char * и делает что с ним? Вы не согласны с вашим примером позже в своем посте. Пожалуйста, дайте понять, что именно вам нужно. – IVlad

+3

, так как вы непреклонны в отношении НЕ использования конструкций C++, вы должны удалить C++ из своего вопроса и вместо этого спросить о C. В это время вы можете принять ответ sprintf. – KevinDTimm

+5

Нет. Ваш компилятор не сломан. – nos

ответ

27

Вы почти наверняка не хотите иметь дело с полукокса * если вы можете помочь ему - вам нужен C++ станд :: строка класс:

#include <string> 
.. 
string name = "fred"; 

или соответствующий класс stringstream:

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

int main() { 

    int player = 0; 
    int cpu = 0; 

    ostringstream os; 
    os << "You: " << player << " CPU: " << cpu; 
    string s = os.str(); 
    cout << s << endl; 
} 

Если вам действительно нужен указатель на символ (и вы не сказали, почему вы так думаете), вы можете получить его из строки, используя его функцию-член c_str().

Все это должно охватываться любым вводным учебником на С ++. Если вы еще этого не купили, получите Accelerated C++. Вы не можете изучать C++ только из интернет-ресурсов.

+6

Согласитесь со всем, кроме последнего комментария ... есть несколько превосходных ресурсов C++ и учебников онлайн, в том числе «A Beginner's C++», «Learn C++ за 21 день», «Parashift C++ FAQ Lite» и «Advanced C++ Lessons», , Разумеется, практика также необходима. –

+0

Что касается запроса char *, предполагая, что функция не будет записываться в строку, можно использовать const_cast (s.c_str()) для преобразования s.c_str() - типа const char * - к объекту типа char *. Однако это очень хаки. Было бы лучше, если возможно, изменить подпись другой функции для использования типа const char * или, что еще лучше, const std :: string &. –

+0

Seconding @MichaelAaronSafyan относительно последнего комментария. Я изучил C++ самостоятельно, с небольшим опытом программирования, и стал достаточно компетентным, прежде чем покупать одну книгу. Я хотел бы добавить http://www.learncpp.com/ в список - это может быть лучшее введение в сети, imo. – Conduit

2

Просто позвоните s.c_str();. Here вы можете увидеть больше.

PS. Вы можете использовать strcpy для копирования содержимого в новую переменную, и тогда вы сможете его изменить.

+0

Но тогда я получаю 'const char *' и мне нужно 'char *'. Я пытался с 'const_cast (str)', но он дает ошибку в библиотеках C++. –

+0

Предлагаю вам подробнее рассказать о том, что вы пытаетесь сделать здесь. –

+0

try const_cast (str.c_str()) –

0

char * означает «указатель на символ».

Вы можете создать указатель на «строка», как это:

char* myString = "My long string"; 

В качестве альтернативы вы можете использовать станд :: строка:

std::string myStdString("Another long string"); 
const char* myStdString.c_str(); 

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

const char* = "My long string"; 
0

Рассмотрите возможность использования stringstreams:

#include <iostream> 
#include <sstream> 

using namespace std; 
int main() 
{ 
    int i = 10; 

    stringstream t; 

    t << "test " << i; 

    cout << t.str(); 
} 
+0

Но он вернет строку, а не char *. –

+0

Я думаю, cout << const_cast (t.str(). C_str()); будет возвращать char * он нуждается, однако это довольно уродливо. Если OP ДОЛЖЕН иметь char *, я предлагаю решение sprintf, размещенное Рупертом Джонсом. – IVlad

6

Если вы работаете с C++, просто используйте std::string. Если вы работаете с char*, вы, вероятно, захотите напрямую работать с C. В случае С, вы можете использовать функцию sprintf:

char* s = // initialized properly 
sprintf(s, "You: %d CPU: %d", player, cpu); 
+0

Я очень новый. Как мне нужно инициализировать '' '? –

+0

Например, с символом 'char s [50]' для 49 символов (+ 0 символов для завершения строки) или 'char * s = new char [50]' для динамического выделения. –

0

Это, вероятно, было бы к лучшему, если C++ был перегрузил оператор «+», как вы показываете. К сожалению, они не сделали (вы можете, если захотите).

Существует три метода преобразования целочисленных переменных в строки на C++; два унаследованных от C и один новый для C++.

  1. itoa() рутина. Это на самом деле нестандартное, но у большинства компиляторов это есть.Самое приятное в том, что он возвращает указатель на строку, поэтому ее можно использовать в программировании в функциональном стиле.
  2. sprintf(). Второе удержание от C, эта процедура принимает строку назначения, строку формата и список параметров. Сколько параметров есть и как они интерпретируются, зависит от того, как анализируется строка «format». Это делает sprintf очень мощным и чрезвычайно опасным. Если вы используете этот подход, я могу в значительной степени гарантировать, что вы столкнетесь с краш-ошибками ваших первых попыток.
  3. std::ostringstream. Путь C++. У этого есть почти все полномочия sprintf(), но много безопаснее. Недостатком здесь является то, что вы должны его объявить, и это не строка, поэтому вам все равно придется преобразовать ее в один, когда вы закончите. Это означает, что по крайней мере три строки кода должны делать что-нибудь с ostringstream. Это также очень уродливо, особенно если вы попробуете какое-то специальное форматирование.