длина строки символа и утечка памяти - PullRequest
0 голосов
/ 09 сентября 2011
int fCount = 0;
char frameNum[7];
sprintf(frameNum, %06u", fCount);


int fCount = 0;
char frameNum[6];
sprintf(frameNum, %06u", fCount);

Q1.Что правильно, 6 или 7?

Q2.Я использую VC6 и файл sample.cpp.
Я думаю, что sprintf - это C. Есть ли лучший способ?Мне нужно, чтобы строка символов была правильно выровнена и с дополненными нулями.

Пожалуйста, не говорите мне использовать более новый компилятор.Сейчас мне нужно использовать VC6.

Ответы [ 4 ]

3 голосов
/ 09 сентября 2011

Первый правильный.Между прочим, утечки памяти нет.

-

Я думаю, что sprintf - это C. Есть ли лучший способ?

Да.C ++ путь:

std::stringstream ss;  //#include <sstream>
ss << fCount;
std::string frameNum = ss.str();
0 голосов
/ 10 сентября 2011

Q1.Что правильно, 6 или 7?

Ни то, ни другое.6 в строке формата - это минимальная ширина, поэтому 7 символов будет недостаточно, если fCount >= 1000000.Наименьший размер, который не будет переполнен для любого ввода - std::numeric_limits<int>::digits10 + 2 (чтобы учесть все десятичные цифры, завершающий символ и знак, если входное значение отрицательное).Предполагая, что VC6 обеспечивает <numeric_limits>;в противном случае sizeof(int)*3 + 2 является разумной верхней границей.Если вы хотите быть уверены, позвоните snprintf и проверьте возвращаемое значение.

Q2.Я использую VC6 и файл sample.cpp.Я думаю, что sprintf - это C. Есть ли лучший способ?Мне нужно, чтобы строка символов была правильно выровнена и имела дополняющие нули.

В большинстве случаев вам лучше использовать строки и потоки C ++, которые управляют собственной памятью и не будут переполнены, если вы не сделаете что-то оченьстранно.

std::ostringstream s;
s << setw(6) << setfill('0') << fCount;
std::string frameNum = s.str();

Я вполне уверен, что VC6 поддерживает их, но прошло уже более десяти лет с тех пор, как мне посчастливилось бороться с этим компилятором, и я приложил все усилия, чтобы точно забыть, насколько он ограничен.было.Я знаю, что вы просили меня не делать этого, но я скажу: используйте более новый компилятор.Язык сильно изменился за последние 15 лет.

0 голосов
/ 09 сентября 2011

Не будет утечки памяти - данные в стеке!

0 голосов
/ 09 сентября 2011

7, так как sprintf добавит нулевой байт '\ 0' в конец строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...