Đối số đầu tiên để sprintf
phải trỏ đến một bộ đệm hợp lệ. Bạn có một char*
nhưng nó chỉ vào thùng rác.
Thay đổi mã của bạn để:
char numString[80] = { };
int charcheck = sprintf(numString, "%d", numCheck);
Vì vậy mà numString
thực sự chỉ đến một bộ đệm hợp lệ (80 ký tự trong ví dụ này, tất cả các yếu tố trong số đó được khởi tạo vào 0).
Nó cũng sẽ là tốt để sử dụng snprintf
để bạn có thể vượt qua kích thước của bộ đệm của bạn với nó, mà sẽ giúp ngăn chặn lỗi tràn bộ đệm:
const int bufsize = 80;
char numString[bufsize] = { };
int charcheck = snprintf(numString, bufsize - 1, "%d", numCheck);
Chú ý rằng bạn trừ đi một từ kích thước bộ đệm mà bạn vượt qua đến snprintf
vì bạn không muốn nó sử dụng vị trí cuối cùng mà bạn muốn đảm bảo là NULL
để biểu thị phần cuối của chuỗi.
Nguồn
2011-08-25 01:44:23
Chính xác vì sao nó hoạt động khi tôi không thu thập kết quả? – syl
Hành vi không xác định. Đôi khi hành vi không xác định hoạt động chính xác như bạn mong đợi, điều này được cho là trường hợp xấu nhất. –
Tại sao bạn đề nghị 'snprintf' trên 'sprintf'? – Kevin