Câu trả lời:
Cách cơ bản là:
printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");
Cách khác, thường hữu ích hơn, là:
printf ("Here are the first %d chars: %.*s\n", 8, 8, "A string that is more than 8 chars");
Tại đây, bạn chỉ định độ dài dưới dạng đối số int cho printf (), xử lý '*' ở định dạng dưới dạng yêu cầu để lấy độ dài từ đối số.
Bạn cũng có thể sử dụng ký hiệu:
printf ("Here are the first 8 chars: %*.*s\n",
8, 8, "A string that is more than 8 chars");
Điều này cũng tương tự với ký hiệu "% 8.8s", nhưng một lần nữa cho phép bạn chỉ định độ dài tối thiểu và tối đa khi chạy - thực tế hơn trong một kịch bản như:
printf("Data: %*.*s Other info: %d\n", minlen, maxlen, string, info);
Đặc tả POSIX để printf()
xác định các cơ chế này.
-
) để làm cho nó có đủ độ dài được chỉ định.
printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");
% 8s sẽ chỉ định độ rộng tối thiểu 8 ký tự. Bạn muốn cắt ngắn ở 8, vì vậy hãy sử dụng% .8s.
Nếu bạn muốn luôn in chính xác 8 ký tự, bạn có thể sử dụng% 8.8s
Ngoài việc chỉ định một lượng ký tự cố định, bạn cũng có thể sử dụng *
điều đó có nghĩa là printf lấy số lượng ký tự từ một đối số:
#include <stdio.h>
int main(int argc, char *argv[])
{
const char hello[] = "Hello world";
printf("message: '%.3s'\n", hello);
printf("message: '%.*s'\n", 3, hello);
printf("message: '%.*s'\n", 5, hello);
return 0;
}
Bản in:
message: 'Hel'
message: 'Hel'
message: 'Hello'
Sử dụng printf
bạn có thể làm
printf("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");
Nếu bạn đang sử dụng C ++, bạn có thể đạt được kết quả tương tự khi sử dụng STL:
using namespace std; // for clarity
string s("A string that is more than 8 chars");
cout << "Here are the first 8 chars: ";
copy(s.begin(), s.begin() + 8, ostream_iterator<char>(cout));
cout << endl;
Hoặc, kém hiệu quả hơn:
cout << "Here are the first 8 chars: " <<
string(s.begin(), s.begin() + 8) << endl;
ostream_iterator<char>(cout)
! Thay vào đó, sử dụng ostreambuf_iterator<char>(cout)
! Sự khác biệt trong hiệu suất nên khá lớn.
std::cout.write(s.data(), 8)
. Hoặc trong C ++ hiện đại std::cout << std::string_view{s.data(), 8}
,.
In bốn ký tự đầu tiên:
printf("%.4s\n", "A string that is more than 8 chars");
Xem liên kết này để biết thêm thông tin (kiểm tra .precision -section)
Trong C ++ thì dễ.
std::copy(someStr.c_str(), someStr.c_str()+n, std::ostream_iterator<char>(std::cout, ""));
EDIT: Cũng an toàn hơn khi sử dụng điều này với các trình vòng lặp chuỗi, vì vậy bạn không chạy đến hết. Tôi không chắc điều gì xảy ra với printf và chuỗi quá ngắn, nhưng tôi đoán điều này có thể an toàn hơn.
std::cout << someStr.substr(0,8);
là rõ ràng hơn nhiều.
Trong C ++, tôi làm theo cách này:
char *buffer = "My house is nice";
string showMsgStr(buffer, buffer + 5);
std::cout << showMsgStr << std::endl;
Xin lưu ý rằng điều này không an toàn vì khi chuyển đối số thứ hai, tôi có thể vượt quá kích thước của chuỗi và tạo ra vi phạm truy cập bộ nhớ. Bạn phải thực hiện kiểm tra của riêng bạn để tránh điều này.