2010-06-01 27 views

Trả lời

6

con trỏ TCHAR đang đến từ bên ngoài, và bên cạnh tôi không có ý tưởng làm thế nào lớn bộ đệm giới thiệu bởi con trỏ là

Nếu đây là như vậy, sau đó không ai trong số những làm những gì bạn muốn.

Cách tất cả các chức năng "an toàn" hoạt động là bạn cho chúng biết bộ đệm mục tiêu lớn như thế nào.

Bạn không biết? Bạn không thể sử dụng các chức năng đó.

int buffer_size = _tcslen(xxx) * sizeof(TCHAR) 

sẽ không hoạt động. Tất cả nó sẽ đảm bảo rằng chuỗi sao chép không dài hơn bất cứ điều gì đã có trong bộ đệm. Nếu bộ đệm không được khởi tạo, nó sẽ thất bại; nếu bộ đệm bắt đầu bằng một số '\0', sẽ không có gì được sao chép; và kể từ đó trở đi.

7

Giả sử bạn đang sử dụng _tcscpy_s và không _tcscpy, tham số thứ hai nên có kích thước thực tế của mảng, và không phải là chiều dài của hiện đang chứa chuỗi. Ví dụ:

TCHAR dest[20]; 
_tcscpy_s(dest, _countof(dest), _T("Hello")); 

Bạn thậm chí có thể sử dụng phiên bản 2 tham số đó sẽ không yêu cầu các thông số kích thước:

_tcscpy_s(dest, _T("Hello")); 

Nếu tchar_pointer thực sự là một con trỏ và không phải là một mảng (như ngụ ý của tên gọi của nó) bạn cần phải rất cẩn thận khi xác định dung lượng thực tế của nó là gì. Thêm bối cảnh sẽ là cần thiết để đề xuất phương pháp tiếp cận đúng, nhưng việc sử dụng độ dài của chuỗi chứa để tính kích thước của bộ đệm gần như chắc chắn là cách tiếp cận sai.

+0

Đề xuất trên 2 sẽ không hoạt động, vì con trỏ tchar đang đến từ bên ngoài và bên của tôi không biết bộ đệm được con trỏ trỏ đến bao nhiêu. –

+3

Sau đó, bạn không thể sử dụng các hàm '_s' an toàn, bởi vì toàn bộ điểm của chúng là bạn cung cấp kích thước bộ đệm. –

2

Nếu tchar_pointer là một con trỏ (trái ngược với mảng), bạn được cho là biết chính xác bộ đệm trỏ đến lớn như thế nào. Nếu bạn không biết, bạn không thể tìm ra từ con trỏ thô, strcpy_s không giúp ích gì.

3

Câu trả lời của bara rất quan trọng đối với bạn, bởi vì câu trả lời đúng khác với tất cả ý tưởng bạn đã liệt kê. Nhưng bara đã không giải thích cho bạn sự khác biệt giữa _tcslen và _tcsclen, vì vậy tôi sẽ làm điều đó.

Trong một trình biên dịch Unicode, _tcslen và _tcsclen cả hai sẽ tính số lượng TCHAR trong giá trị hiện tại của chuỗi. Mỗi TCHAR là một wchar_t.

Trong một trình biên dịch Multibyte, _tcslen sẽ đếm số lượng TCHAR trong giá trị hiện tại của chuỗi. Mỗi TCHAR là một char. Nhưng _tcsclen sẽ đếm số ký tự nhiều byte trong giá trị hiện tại của chuỗi. Mỗi ký tự nhiều byte là một hoặc nhiều TCHAR, mỗi ký tự nhiều byte là một hoặc nhiều ký tự. Các ký tự nhiều byte khác nhau có thể có độ dài khác nhau, tùy thuộc vào trang mã và các ký tự riêng lẻ.

+0

Vì vậy, tôi có thể sử dụng int buffer_size = _tcslen (xxx) * sizeof (TCHAR) cho các tham số thứ 2 cho cả môi trường unicode và multibyte? –

+2

Không, nhưng bạn có thể sử dụng int current_occupied_size = _tcslen (xxx) * sizeof (TCHAR) cho tham số thứ 2 cho cả môi trường unicode và multibyte. Nếu kích thước bộ đệm lớn hơn kích thước hiện đang chiếm đóng thì bạn đang lãng phí không gian mà bạn không thể đo lường được. Nếu kích thước bộ đệm nhỏ hơn kích thước hiện đang bị chiếm đóng thì bạn có tràn bộ đệm và bạn đang giúp lan truyền vi-rút. Bạn nên tìm hiểu những gì kích thước bộ đệm thực sự là. –

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