Có cách nào để xác định có bao nhiêu ký tự của một chuỗi để in ra bằng printf () không?


127

Có cách nào để xác định có bao nhiêu ký tự của một chuỗi cần in ra (tương tự như số thập phân trong ints) không?

printf ("Here are the first 8 chars: %s\n", "A string that is more than 8 chars");

Muốn in nó: Here are the first 8 chars: A string

Câu trả lời:


226

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.


2
Đến ví dụ cuối: Điều gì xảy ra nếu chuỗi sao chép ngắn hơn minlen?
Truthseeker

4
Đầu ra sẽ được đệm trống (ở bên trái trừ khi bạn thêm a -) để làm cho nó có đủ độ dài được chỉ định.
Jonathan Leffler

13
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


13

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'

11

Sử dụng printfbạ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;

1
Lưu ý: không sử dụng 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.
Dietmar Kühl

Cách hiệu quả hơn để thay vì sử dụng : std::cout.write(s.data(), 8). Hoặc trong C ++ hiện đại std::cout << std::string_view{s.data(), 8},.
Artyer

4

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)


4

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.


32
ha, vâng đó là "dễ dàng". C ++ luôn trông giống như tai nạn xe hơi.
Tổng thống James K. Polk

bạn vẫn có thể thực hiện printf () trong c ++ :)
StasM

6
Tôi nghĩ rằng đây là mỉa mai. std::cout << someStr.substr(0,8);là rõ ràng hơn nhiều.
MSalters

2
@MSalters Bạn nên đăng nó như một câu trả lời.
Jonathan Mee


1

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.