C ++ скопировать std :: string в массив char без нулевого завершения - PullRequest
6 голосов
/ 01 декабря 2011

Я пишу в двоичный файл, используя структуру, которая просто содержит символ [32].Мне в основном нужно отформатировать каждый блок данных, выполняя различные вычисления над строковыми массивами и объединяя результаты.Я пытаюсь скопировать std :: string в массив char без нулевого завершения.Чем больше я это читаю, тем больше путаюсь.Если я сделаю:

struct block{
    char data[32];
};
block blocks[2048];
std::string buffer;

buffer = "12345678123456781234567812345678";
strcpy(blocks[0].data, buffer.c_str());

я получу ошибку, потому что добавление нулевого терминатора с помощью c_str () приводит к длине строки 33. Если я вычитаю один символ из строки, это работает, но тогда у менянулевой терминатор, который я не хочу.Я могу успешно сделать следующее:

strcpy(blocks[0].data, "12345678123456781234567812345678");

, но сначала я хочу создать строку, поскольку она часто включает в себя конкатенацию разных строк из разных массивов.Например, я могу сделать это с помощью std :: string:

std::string buffer = stringArray1[0] + stringArray2[0];
strcpy(blocks[0].data, buffer.c_str());

, но тогда у меня снова будет нулевой терминатор.Я просто хотел бы скопировать точно символы в std :: string без нулевого терминатора.

Я использую VC ++ 6.0.

Ответы [ 4 ]

16 голосов
/ 01 декабря 2011

Вы не можете использовать strcpy, потому что он ищет терминатор NULL для определения конца строки и копирует NULL в выходную строку.

Так как вы переходите от string для буфера символов проще всего было бы использовать std::copy:

#include <algorithm>

static const size_t data_size = 32;
struct block{
    char data[data_size];
};

/* ... */

std::string buffer = stringArray1[0] + stringArray2[0];
std::copy( buffer.begin(), buffer.end(), blocks[0].data );

И, кстати, вы могли бы использовать vector<char> вместо char data[32]

РЕДАКТИРОВАТЬ:

Кроме того: VC6 является древним компилятором, который был плохим, когда он вышел, ужасным, когда был ратифицирован стандарт C ++, и полностью не поддерживается Microsoft.Если что-то пойдет не так, они даже не будут говорить с вами.Вы должны сойти с VC6 как можно скорее.

11 голосов
/ 01 декабря 2011

Используйте memcpy вместо strcpy, вот для чего:

memcpy(blocks[0].data, buffer.data(), sizeof(blocks[0].data)); 
1 голос
/ 01 декабря 2011

Используйте strncpy() вместо strcpy():

strncpy(blocks[0].data, buffer.c_str(), 32); 
0 голосов
/ 01 декабря 2011

Используйте одну из строк ниже

memcpy(blocks[0].data, buffer.c_str(), buffer.size());
memcpy(blocks[0].data, buffer.c_str(), 32);
memcpy(blocks[0].data, buffer.c_str(), buffer.size() > 32 ? 32 : buffer.size());
std::copy(buffer.begin(), buffer.end(), blocks[0].data).

Кстати, вы обрабатываете случай, когда строка короче 32 символов?Вы хотите добавить нулевой байт?

...