Использую следующий код:
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, заполняя остальное пространство знаками вопроса ?.
Почему это произошло и как этого избежать? Объявление обязательно должно быть внутри функции.
Если string является ::std::string, то конструктор будет принимать на вход оканчивающуюся нулем строку, а вы ей передаете буфер потенциально полностью забитый мусором. Инициализация вне функции видимо работает так как глобальные переменные всегда инициализируются нулями. Соответственно перед присваиванием надо проверить результат вызова recv и поместить в строку именно полученное количество байт:
if((0 < mret) && (mret <= sizeof(buffer))
{
response.assign(buffer, static_cast<size_t>(mret));
}
else
{
// обработка ошибок...
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей