2013-12-11 15 views
5

Tôi đang gặp vấn đề với vòng lặp, tôi không biết tại sao nhưng vòng lặp không bao giờ kết thúc.sprintf trong C, vòng lặp không bao giờ kết thúc

int main(int argc, char *argv[]) 
{ 
    int j; 
    char s[2]; 
    for(j=1;j<=3;j++) 
    { 
     sprintf(s,"s%d",j); 
     printf("%s", s); 
    } 
    system("PAUSE");  
    return 0; 
} 

Tôi nghĩ vòng lặp sẽ hiển thị s1s2s3 trong bảng điều khiển.

+0

Ví dụ điển hình về câu hỏi. SSCCE, kết quả mong đợi, kết quả thực tế. Không hơn không kém. –

+2

[Hành vi không xác định] (http://en.wikipedia.org/wiki/Undefined_behavior) –

Trả lời

8

char s[2]; phải là char s[3];, nếu không bạn sẽ bị tràn bộ đệm.


Abhineet giải thích lý do thay đổi là cần thiết. Tuy nhiên, để chứng thực câu trả lời của mình, đây là phần liên quan từ tiêu chuẩn.

7.19.6.6

Chức năng sprintf tương đương với fprintf, ngoại trừ việc sản lượng được viết vào một mảng (fi Speci ed bởi đối số s) chứ không phải là một dòng . Ký tự rỗng được viết ở cuối ký tự được viết; nó không được tính là một phần của giá trị trả về. Nếu việc sao chép diễn ra giữa các đối tượng chồng lên nhau, hành vi sẽ không được xác định.

+0

cảm ơn, hiện đang hoạt động tốt :) – user3014282

+0

nếu câu trả lời giúp bạn, đừng quên chấp nhận điều đó. –

+1

Bạn có thể chấp nhận câu trả lời trong 7 phút (là 15) ... – user3014282

4

Từ documentation,

Kích thước của bộ đệm phải đủ lớn để chứa toàn bộ chuỗi kết quả.

Bạn đã đẩy hai ký tự thành s, do đó, không có đủ không gian để gắn thêm \0. Điều này sẽ gây ra hành vi không xác định. Giải pháp là cung cấp thêm một bộ nhớ char để nối thêm \0.

char s[2]; để char s[3];

Tôi biết tôi đã trả lời khá muộn nhưng không thể ngăn bản thân mình từ giải thích OP, "tại sao ông phải sử dụng s [3] thay vì s [2]?"

+0

Không bao giờ, tôi đã tìm thấy câu trả lời trong tiêu chuẩn. –

Các vấn đề liên quan