escribiendo datos de printf en una variable de cadena en c ++ / cli

Necesito enviar datos formateados a un puerto tcp ip en mi programa c++/cli. Tengo este código sin éxito

String^ data;
sprintf(data,"L,%02u%02u%02u%02u%02u%02u%03u,%lf %lf\n",rDateTime.uiYear, rDateTime.usiMonth, rDateTime.usiDay,
                rDateTime.usiHour, rDateTime.usiMinute, rDateTime.usiSec, 
                rDateTime.udiUSec / 1000,container[i].first,container[i].second);

Recibo el error *error C2664: 'sprintf': no ​​se puede convertir el parámetro 1 de 'System::String ^' a char **

Quiero escribirlo en una variable de cadena. std :: string.

¿Alguien puede proporcionar algunas sugerencias? Si al menos lo convierto a Sistema::Cadena^. Puedo convertirlo a std:string usando esto Conversión de C ++ / CLI de System :: String ^ a std :: string. Pero no sé cómo escribir los diferentes tipos de datos en una cadena^ en c++/cli..

preguntado el 04 de julio de 12 a las 04:07

sprintf probablemente sería lo que estás buscando si está allí en cli. -

¿Ha considerado System::String::Format? -

@chris. Lo intenté antes y edité mi pregunta en consecuencia:

sprintf() es una función de biblioteca nativa de C, requiere un char[] como primer argumento. Un System::String no es un char[]. Use un char[] y conviértalo a String o use String::Format(). Debería ponerse al día con el formato de cadenas compuestas si planea escribir más código C++/CLI. -

@HansPassant ¿Puedo dar un ejemplo de código? Recién estoy comenzando mis pasos en c++/cli. -

4 Respuestas

Necesitas declarar una variable temporal con tipo char*. Estoy usando una matriz fija aquí con fines de demostración. Dado que puede tener una cadena larga, le sugiero que mire _snprintf para evitar el error de desbordamiento del búfer.

Después de meter la cuerda char*, puede crear un administrador System::String usar gcnew

char str[1024];

sprintf(str,"L,%02u%02u%02u%02u%02u%02u%03u,%lf %lf\n",rDateTime.uiYear, rDateTime.usiMonth, rDateTime.usiDay, 
            rDateTime.usiHour, rDateTime.usiMinute, rDateTime.usiSec,  
            rDateTime.udiUSec / 1000,container[i].first,container[i].second); 

System::String^ data = gcnew System::String(str); 
Console::WriteLine(data);

Respondido 04 Jul 12, 07:07

El sprintf () La función toma una matriz de caracteres (char *) como su primer argumento. Si desea usarlo de esta manera, primero debe escribir en una matriz de caracteres y luego convertirla en una cadena. no sé sobre System::String^, pero puede convertir una matriz de caracteres en una std::string mediante una simple asignación como esta:

char * data = new char[50];
sprintf(data, "Your text goes here");
std::string str = data;

¡No olvide asignar memoria para la matriz de caracteres! si lo olvidas y escribes algo como esto:

char * data;
sprintf(data, "Your text goes here");

vas a recibir un error. Por otro lado, si std::string es adecuado para usted, puede formatearlo directamente usando manipuladores de formato

Respondido 04 Jul 12, 07:07

Me doy cuenta de que esta no es la manera de hacerlo si está escribiendo código administrado nuevo, pero si está transfiriendo código C++ heredado no administrado que funciona con printf y const char*, no hay razón para reescribir todo Just to be right.

Esto funciona para mí y debería funcionar de manera segura para cadenas de cualquier tamaño. Lo uso para envolver algunas funciones que llaman a Trace (...) para dar flexibilidad de tener una Acción delegada que se ocupe de los mensajes de registro.

void TraceBase1(const char* prefix, const char* format, va_list argp) {
  if (Logger::m_logDelegate != nullptr) {

    System::String^ message;

    int count = _vscprintf(format,argp) + 1;
    char* buffer = new char[count ];
    try {
        _vsnprintf(buffer,count,format,argp);
        message =  gcnew System::String(buffer);
        Logger::m_logDelegate(message);
    }
    finally {
        delete[] buffer;
    }
  }
}

contestado el 09 de mayo de 13 a las 16:05

¿Has mirado cómo correr funciona en tu plataforma?

Respondido 04 Jul 12, 04:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.