escribiendo datos de printf en una variable de cadena en c ++ / cli
Frecuentes
Visto 4,869 equipos
0
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..
4 Respuestas
3
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
1
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
1
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
0
¿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 c++ string c++-cli or haz tu propia pregunta.
sprintf
probablemente sería lo que estás buscando si está allí en cli. - chris¿Ha considerado System::String::Format? - reuben
@chris. Lo intenté antes y edité mi pregunta en consecuencia: ShivShambo
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. - Hans Passant
@HansPassant ¿Puedo dar un ejemplo de código? Recién estoy comenzando mis pasos en c++/cli. - ShivShambo