2010-02-18 23 views
7

Soy nuevo en C++. Quiero hacer un char*, pero no sé cómo.
en Java es sólo esto:C++: Cómo compilar Strings/char *

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

¿Cómo puedo hacer esto? Necesito un char*.

Me estoy centrando en pegar el entero después de la cadena.

+0

¿Qué estás tratando de hacer exactamente? ¿Necesita un método que tenga un carácter * y que haga con él? Estás contradiciendo tu ejemplo más adelante en tu publicación. Por favor, tenga claro qué es exactamente lo que necesita. – IVlad

+3

dado que usted es inflexible acerca de NO usar construcciones de C++, debe eliminar el C++ de su pregunta y, en su lugar, preguntar por C. En ese momento puede aceptar la respuesta de sprintf. – KevinDTimm

+5

No. Su compilador no está roto. – nos

Respuesta

27

es casi seguro que no quiere tratar con char * si puede evitarlo - que necesita de C++ clase std :: string:

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

o la clase stringstream relacionada:

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

si realmente necesita un puntero de carácter (y no ha dicho por qué cree que lo hace), puede obtener uno de una cadena utilizando su función de miembro c_str().

Todo esto debe estar cubierto por cualquier libro de texto introductorio de C++. Si aún no ha comprado uno, obtenga Accelerated C++. No puede aprender C++ solo de los recursos de Internet.

+6

Estoy de acuerdo con todo, excepto el último comentario ... hay algunos recursos y tutoriales en línea C++ excelentes, que incluyen "C++ para principiantes", "C++ para aprender C++ en 21 días", "Preguntas frecuentes sobre Parashift C++ Lite" y "Lecciones avanzadas para C++" . Por supuesto, la práctica también es necesaria. –

+0

Con respecto a la solicitud char * ... suponiendo que la función no va a escribir en la cadena, es posible usar const_cast (s.c_str()) para convertir s.c_str() - que es de tipo const char * - a un objeto de tipo char *. Sin embargo, esto es muy hackish. Sería mejor, si fuera posible, cambiar la firma de la otra función para usar el tipo const char * o, incluso mejor, const std :: string &. –

+0

Secundando a @MichaelAaronSafyan con respecto al último comentario. Aprendí C++ por mi cuenta, con poca experiencia en programación, y me volví bastante competente antes de comprar un solo libro. Me gustaría agregar http://www.learncpp.com/ a la lista; puede ser la mejor presentación en la red, imo. – Conduit

2

Simplemente llame al s.c_str();. Here usted puede ver más.

PS. Puede usar strcpy para copiar el contenido a la nueva variable y luego podrá cambiarlo.

+0

Pero luego obtengo un 'const char *' y necesito 'char *'. Intenté con 'const_cast (str)', pero da un error en las bibliotecas de C++. –

+0

Te sugiero que elabores más de lo que estás tratando de hacer aquí. –

+0

intente const_cast (str.c_str()) –

0

char * significa "puntero a un personaje".

Puede crear un puntero a una 'cadena' de esta manera:

char* myString = "My long string"; 

Alternativamente, puede utilizar std :: string:

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

Aviso la const al comienzo del último ejemplo . Esto significa que no puede cambiar los caracteres que se señalan. Puede hacer lo mismo con el primer ejemplo:

const char* = "My long string"; 
0

considerar el uso de stringstreams:

#include <iostream> 
#include <sstream> 

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

    stringstream t; 

    t << "test " << i; 

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

Pero devolverá string y no char *. –

+0

Creo cout << const_cast (t.str(). C_str()); devolverá el carbón * que necesita, sin embargo, eso es bastante feo. Si el OP DEBE tener un char *, sugiero la solución sprintf publicada por Rupert Jones. – IVlad

6

Si está trabajando con C++, simplemente use std::string. Si trabajas con char*, probablemente quieras trabajar directamente con C. En caso de C, puede utilizar la función sprintf:

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

Soy muy nuevo. ¿Cómo debo inicializar 's'? –

+0

Por ejemplo con 'char s [50]' para 49 caracteres (+ 0 caracteres para la terminación de cadena) o 'char * s = new char [50]' para asignación dinámica. –

0

Probablemente hubiera sido por la mejor si C++ había sobrecargado el operador "+" como usted muestra. Tristemente, no lo hicieron (puedes, si quieres).

Existen básicamente tres métodos para convertir variables enteras a cadenas en C++; dos heredados de C y uno nuevo para C++.

  1. La rutina itoa(). Esto no es estándar, pero la mayoría de los compiladores lo tienen.Lo bueno es que devuelve un puntero a la cadena, por lo que se puede utilizar en la programación de estilo funcional.
  2. sprintf(). El segundo remanente de C, esta rutina toma una cadena de destino, una cadena de formato y una lista de parámetros. La cantidad de parámetros que existen y cómo se interpretan dependen de cómo se analiza la cadena de "formato". Esto hace que sprintf sea inmensamente poderoso e inmensamente peligroso. Si utilizas este enfoque, puedo garantizarte que tendrás errores en tus primeros intentos.
  3. std::ostringstream. La forma C++. Esto tiene prácticamente todo el poder de sprintf(), pero es mucho más seguro. El inconveniente aquí es que tiene que declararlo, y es no una cadena, por lo que todavía tiene que convertirlo a uno cuando haya terminado. Eso significa que se requieren al menos tres líneas de código para hacer cualquier cosa con un ostringstream. También es realmente feo, particularmente si intentas cualquier formateo especial.