Sprintf () ошибка - PullRequest
       1

Sprintf () ошибка

0 голосов
/ 07 января 2011

В моем проекте есть Binary2String().

Хорошо работает долго. Но это исключение, когда vec[0] = 255 на sprintf(temp, "%02d ", vec[i]);.

Оригинальный код как этот,

void Binary2String(const vector<unsigned char>& vec, string& result)
{

 if(vec.size() == 0)
  return;

 for(size_t i = 0; i < vec.size(); i++)
 {
  char temp[4] = {0};
  sprintf(temp, "%02d ", vec[i]);
  result.push_back(temp[0]);
  result.push_back(temp[1]);
  result.push_back(temp[2]);

 }
}

Затем я исправил ошибку, так как я не могу понять, что вектор и sprintf () завершены.

Это имеет смысл или нет? (Я новичок в C ++. Спасибо)

        char temp[6] = {0};
  sprintf(temp, "%02d ", vec[i]);
  result.push_back(temp[0]);
  result.push_back(temp[1]);
  result.push_back(temp[2]);
        result.push_back(temp[3]);
  result.push_back(temp[4]);

1 Ответ

4 голосов
/ 07 января 2011

Прежде всего, %02d не является правильным форматом, поскольку значения могут содержать до 3 цифр (%03d будет более подходящим).И как говорит Крис в комментарии ниже, %03hhu будет технически правильным спецификатором (чтобы понять, %03hhu, взгляните на этот шпаргалка ).

Во-вторых, вам нужно5 байтов для хранения символов "2", "5", "5", "", 0 (у вас есть дополнительный пробел в конце %02d).Либо удалите пробел, либо увеличьте буфер как минимум до 5 символов (как вы это сделали).

Наконец, вы можете преобразовать в строку гораздо более надежно следующим образом:

template<typename T> std::string ToString(const T& in) {
    std::basic_ostringstream<char> o;
    if (!(o << in)) {
        // error, throw an exception
    }
    return o.str();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...