2014-10-02 17 views
5

Chương trình của tôi chạy trên nhiều nền tảng. Trong số đó, Windows CE. Hiện tại, sprintf được sử dụng rộng rãi, dẫn đến nhiều vấn đề với tràn bộ đệm vv. Thay vào đó, tôi muốn thay thế chúng bằng các cuộc gọi đến snprintf. Cho Visual Studio, tôi thấy câu hỏi này, mà giải quyết được phần win32 của vấn đề:snprintf cho Windows CE

snprintf and Visual Studio 2010

nhưng tôi không thể có được nó làm việc cho Windows CE, vì các chức năng _vsnprintf_s_vscprintf, và hằng số _TUNCATE không có sẵn. Có ai biết một cách để nhân rộng hành vi snprintf (linux) trên Windows CE?

+0

Kiểm tra xem phản hồi này có thể cung cấp cho bạn thông tin hữu ích http://stackoverflow.com/questions/23882340/windows-ce-5-0-vs-windows-mobile-6/23883768#23883768 – daniele3004

Trả lời

1

Cho đến nay tôi đã kết thúc trên chức năng sau:

int my_snprintf(char* str, size_t size, const char* format, ...) 
{ 
    int len = 0; 
    va_list ap; 

    if (size == 0) 
    { 
     return 0; 
    } 

    va_start(ap, format); 
    len = _vsnprintf(str, size, format, ap); 
    va_end(ap); 

    if (len < 0 || len >= size) 
    { 
     len = size - 1; 
    } 

    if (size > 0) 
    { 
     str[size - 1] = '\0'; 
    } 

    return len; 
} 

thử nghiệm sơ bộ có vẻ OK, và thậm chí nó biên dịch cho WinCE .. Bất kỳ thông tin phản hồi được đánh giá rất

+1

Có vẻ tốt cho đến nay không. Chỉ cần có nó đề cập: Bạn nhận thức được rằng 'snprintf' không sửa mã lỗi? Bạn cần phải viết lại một trong hai cách, bạn phải kiểm tra giá trị trả về của 'snprintf' để xem có đủ không gian và nếu không, hãy tái phân bổ bộ đệm (hoặc bất kỳ điều gì thích hợp trong trường hợp của bạn). – mafso

+0

vâng tôi nhận thức được - đó sẽ là bước tiếp theo trong việc gỡ lỗi mã. Mục đích chính bây giờ là để tránh một số tai nạn bí ẩn gây ra bởi các dòng tràn – pjaall

+0

'Mục đích chính bây giờ là tránh một số sự cố bí ẩn gây ra bởi tràn - Tôi không nghĩ rằng bạn sẽ sửa lỗi của bạn làm điều này, nó sẽ chỉ ẩn vấn đề gốc thực sự. snprintf sẽ bảo vệ chống lại tràn bộ đệm, nhưng nếu logic mã của bạn yêu cầu dữ liệu lớn hơn và bộ đệm quá nhỏ thì nó vẫn sẽ không hoạt động đúng. – marcinj

0

Tôi nghĩ rằng, bạn có thể sử dụng chức năng cụ thể của Microsoft printf_s. Tôi không chắc nó tương thích 100%, và tôi nghĩ nó không cho phép bộ đệm rỗng khi kích thước bằng 0, nhưng nó có thể đủ cho yêu cầu của bạn và ... Tôi không có VS2010 để xác nhận printf_s có mặt Phiên bản Windows CE.

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