2011-11-29 22 views
5

Với biến C++ std::string bao gồm các ký tự tab, có thể xác định độ dài của chuỗi đó giống như nó xuất hiện trên "màn hình" không? tức là:Cách xác định độ dài (in) của chuỗi std :: với các ký tự tab được mở rộng?

std::string var = "\t\t\t"; 
std::cout << var.length();   // result: 3 
std::cout << printed_length(var); // result: 3*(# of spaces per tab) 
+0

Tôi giả định không có giải pháp nền tảng chéo nào cho điều này. Không chắc chắn mặc dù. Chỉ định hệ điều hành đích của bạn. –

+7

Chiều rộng của một tab không thể biết, trừ khi bạn biết chính xác vị trí văn bản của bạn được hiển thị (sau đó trình kết xuất sẽ biết chiều rộng của một tab so với khoảng trắng) –

+0

@ the_drow: Tôi hiện đang sử dụng MinGW GCC 3.4.5 với MSYS trên Windows XP. –

Trả lời

3

Không dễ dàng. Nó là không thể mà không có kiến ​​thức cụ thể về "màn hình" liên quan (thực sự, phần mềm lái xe đầu ra), bởi vì mở rộng tab thay đổi rất rộng rãi. Có bốn khả năng khá rõ ràng, dựa trên việc mở rộng cố định so với việc mở rộng thành nhiều thứ, và dựa trên các ô ký tự so với một số phép đo cố định khác (ví dụ, đối với các phông tỷ lệ). Ngoài ra còn có "các tab thông minh" với các tiêu chí phức tạp hơn, trong đó mở rộng một tab có thể phụ thuộc vào một tab khác.

Trên "bảng điều khiển" điển hình sẽ là ô mở rộng mod 8 ký tự. Để đối phó với điều đó, bạn sẽ không chỉ phải đếm các tab, mà còn nhìn vào vị trí của mỗi tab trong chuỗi. Bạn cũng sẽ phải thực hiện một số giả định (hoặc cung cấp một tham số) về vị trí bắt đầu của chuỗi tương ứng với một điểm dừng tab.

Tóm lại: nếu bạn muốn làm điều gì đó như thế này, bạn sẽ phải tự làm điều đó, dựa trên kiến ​​thức về cách các tab sẽ được mở rộng trên mục tiêu của bạn.

3

Chúng tôi sẽ làm cho giả định đơn giản hóa rằng văn bản trong chuỗi là văn bản duy nhất trên một dòng hoặc nó bắt đầu trên một ranh giới tab.

Mỗi ký tự tab sẽ mở rộng đến một số không gian khác nhau dựa trên số ký tự trước đó.

expansion_count = n_spaces - (current_count % n_spaces); 
Các vấn đề liên quan