Размер buffer`а

160
26 февраля 2018, 01:53

Использую следующий код:

int mret;
char buffer[2048];
string response;
mret = recv(s, buffer, sizeof(buffer), 0);
response = string(buffer);
fill_n(buffer, sizeof(buffer), NULL);

При этом все объявления делаю за пределами функции. Однако, если перенести их внутрь функции (что мне сейчас и нужно), то происходит не приятная ситуация: responce вместо того, что бы подстроить свой size автоматически, равным размерам текста из buffer (допустим 200), ставит size равным 2058, заполняя остальное пространство знаками вопроса ?.

Почему это произошло и как этого избежать? Объявление обязательно должно быть внутри функции.

Answer 1

Если string является ::std::string, то конструктор будет принимать на вход оканчивающуюся нулем строку, а вы ей передаете буфер потенциально полностью забитый мусором. Инициализация вне функции видимо работает так как глобальные переменные всегда инициализируются нулями. Соответственно перед присваиванием надо проверить результат вызова recv и поместить в строку именно полученное количество байт:

if((0 < mret) && (mret <= sizeof(buffer))
{
    response.assign(buffer, static_cast<size_t>(mret));
}
else
{
    // обработка ошибок...
}
READ ALSO
Установка Parallel STL на Ububtu 16.04

Установка Parallel STL на Ububtu 16.04

Здравствуйте, подскажите, пожалуйста, как установить Parallel STL на Ubuntu 1604 пробовал по инструкциям от сюда https://software

131
Получение введённой в консоль строки

Получение введённой в консоль строки

Использую для получения строки с консоли

234