Soy relativamente nuevo en C++. Las asignaciones recientes han requerido que convierta una multitud de almacenamientos intermedios de char (desde estructuras/sockets, etc.) a cadenas. He estado usando variaciones en lo siguiente, pero parecen incómodas. ¿Hay una mejor manera de hacer este tipo de cosas?¿Buenos métodos para convertir búferes de matriz char a cadenas?
#include <iostream>
#include <string>
using std::string;
using std::cout;
using std::endl;
char* bufferToCString(char *buff, int buffSize, char *str)
{
memset(str, '\0', buffSize + 1);
return(strncpy(str, buff, buffSize));
}
string& bufferToString(char* buffer, int bufflen, string& str)
{
char temp[bufflen];
memset(temp, '\0', bufflen + 1);
strncpy(temp, buffer, bufflen);
return(str.assign(temp));
}
int main(int argc, char *argv[])
{
char buff[4] = {'a', 'b', 'c', 'd'};
char str[5];
string str2;
cout << bufferToCString(buff, sizeof(buff), str) << endl;
cout << bufferToString(buff, sizeof(buff), str2) << endl;
}
Para Newton Falls: tenga en cuenta que std :: string (Ch * p, size_type n) no se detendrá en los caracteres nulos si hay alguno en el búfer; todos los n caracteres se copiarán en la cadena. – outis
Gracias Simon. Pasé por alto completamente a ese constructor. Esta o la sugerencia de David Dolson sobre el rango de rango parece una solución mucho mejor que lo que estaba haciendo. –
Estoy totalmente de acuerdo en evitar la versión de cadena C si es posible. Tratar cstrings sin procesar solo te pondrá en problemas en estos días. Hay varios errores en su bufferToCString, incluida la sobrescritura de memoria desconocida mediante el uso de bufsize + 1, y suponiendo que su búfer de salida 'str' es bufsize + 1 del búfer de entrada. Estos errores se expondrán de manera sutil y te causarán muchos dolores de depuración. Simplemente use std :: string si puede. –