На самом деле оба имеют одну и ту же проблему, а именно неопределенное поведение . Отсюда проблема:
char strNumber[6];
Эта переменная не может вместить значение 999 x 999
в строковом представлении, поскольку в конце также есть нулевой символ '\0'
. Поэтому, когда вы вызываете sprintf
для преобразования целого числа в его строковое представление, прямо внутри функции она вызывает неопределенное поведение, когда пытается поставить символ '\0'
в индекс 6
, потому что индексы 0
в 5
уже заняты шестью цифрами 998001
, который является произведением 999 x 999
.
Вы должны определить его как минимум размером 7
:
char strNumber[7]; //one char for null-character.
Что касается того, почему ваш второй код работает, так это потому, что вам повезло (скорее не повезло ). Вот что означает неопределенное поведение: может произойти все, что угодно . Это может бежать, или не может. Ни спецификация языка, ни компилятор не дают никаких гарантий поведения, следовательно, undefined поведение.
Как отметил @James Kanze в комментарии, реальное решение - забыть о sprintf
и лучше использовать std::ostringstream
и std::string
как:
#include <sstream> //for std::ostringstream
#include <string> //for std::string
std::ostringstream ss;
ss << number;
std::string s = ss.str(); //get the string representation of the number