Je suis relativement nouveau en C++. Les affectations récentes ont nécessité que je convertisse une multitude de tampons char (de structures/sockets, etc.) en chaînes. J'ai utilisé des variations sur les éléments suivants, mais ils semblent maladroits. Y a-t-il une meilleure façon de faire ce genre de chose?De bonnes méthodes pour convertir des tampons de tableau char en chaînes?
#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;
}
Pour Newton Falls: notez que std :: string (Ch * p, taille_type n) ne s'arrêtera pas aux caractères null s'il y en a dans le buffer; tous les n caractères seront copiés dans la chaîne. – outis
Merci Simon. J'ai complètement oublié ce constructeur. Ceci ou la suggestion de David Dolson de la gamme ctor semble une bien meilleure solution que ce que je faisais. –
Je suis complètement d'accord pour éviter la version de chaîne C si elle est posible. Traiter avec des cstrings bruts ne vous mènera à des ennuis ces jours-ci. Il y a plusieurs bugs dans votre bufferToCString, y compris l'écrasement de la mémoire inconnue en utilisant bufsize + 1, et en supposant que votre tampon de sortie 'str' est bufsize + 1 du buffer d'entrée. Ces bugs s'exposent de manière subtile et vous causent beaucoup de douleur de débogage. Utilisez simplement std :: string si vous le pouvez. –