Giả sử bạn có một chuỗi KHÔNG null
bị kết thúc và bạn biết kích thước chính xác của nó, vậy làm cách nào bạn có thể in chuỗi đó bằng printf
C? Tôi nhớ lại một phương pháp như vậy nhưng tôi không thể tìm ra bây giờ ...
Giả sử bạn có một chuỗi KHÔNG null
bị kết thúc và bạn biết kích thước chính xác của nó, vậy làm cách nào bạn có thể in chuỗi đó bằng printf
C? Tôi nhớ lại một phương pháp như vậy nhưng tôi không thể tìm ra bây giờ ...
Câu trả lời:
Có một khả năng xảy ra với printf, nó sẽ như thế này:
printf("%.*s", stringLength, pointerToString);
Không cần sao chép bất cứ thứ gì, không cần sửa đổi chuỗi hoặc bộ đệm gốc.
printf
thậm chí sau một thập kỷ ~ ... :)
printf
sẽ in tối đa 11 ký tự hoặc cho đến khi nó gặp NULL, tùy điều kiện nào đến trước; trong ví dụ của bạn, NULL đứng trước. Việc chỉ định độ dài tối đa không làm cho NULL mất đi ý nghĩa "end-of-string" đối với printf
.
Đây là phần giải thích về cách thức %.*s
hoạt động và nơi nó được chỉ định.
Các thông số kỹ thuật chuyển đổi trong chuỗi mẫu printf có dạng chung:
% [ param-no $] flags width [ . precision ] type conversion
hoặc là
% [ param-no $] flags width . * [ param-no $] type conversion
Hình thức thứ hai là để lấy độ chính xác từ danh sách đối số:
Bạn cũng có thể chỉ định độ chính xác của '*'. Điều này có nghĩa là đối số tiếp theo trong danh sách đối số (trước giá trị thực được in) được sử dụng làm độ chính xác. Giá trị phải là int và bị bỏ qua nếu nó là giá trị âm.
- Cú pháp chuyển đổi đầu ra trong sổ tay hướng dẫn sử dụng glibc
Đối với %s
định dạng chuỗi, độ chính xác có một ý nghĩa đặc biệt:
Có thể chỉ định độ chính xác để chỉ ra số ký tự tối đa để viết; nếu không thì các ký tự trong chuỗi lên đến nhưng không bao gồm ký tự null kết thúc được ghi vào luồng đầu ra.
- Các chuyển đổi đầu ra khác trong sổ tay glibc
Các biến thể hữu ích khác:
"%*.*s", maxlen, maxlen, val
sẽ căn phải, chèn khoảng trắng trước;"%-*.*s", maxlen, maxlen, val
sẽ căn trái."%-*.*s", padding, str_view.size(), str_view.data()
Bạn có thể sử dụng một fwrite () để stdout!
fwrite(your_string, sizeof(char), number_of_chars, stdout);
Bằng cách này, bạn sẽ xuất các ký tự đầu tiên (số được xác định trong biến number_of_chars) vào một tệp, trong trường hợp này là stdout (đầu ra chuẩn, màn hình của bạn)!
printf("%.*s", length, string)
sẽ không làm việc.
Điều này có nghĩa là in độ dài LÊN ĐẾN byte HOẶC byte rỗng, tùy điều kiện nào đến trước. Nếu mảng ký tự không bị kết thúc bằng null của bạn chứa byte rỗng TRƯỚC độ dài, printf sẽ dừng trên những ký tự đó và không tiếp tục.
#include<string.h>
int main()
{
/*suppose a string str which is not null terminated and n is its length*/
int i;
for(i=0;i<n;i++)
{
printf("%c",str[i]);
}
return 0;
}
Tôi đã chỉnh sửa mã, đó là cách khác:
#include<stdio.h>
int main()
{
printf ("%.5s","fahaduddin");/*if 5 is the number of bytes to be printed and fahaduddin is the string.*/
return 0;
}
C
ngữ cảnh, tất cả các chuỗi được kết thúc bằng rỗng. Mảng của char mà không có một null trong số đó là không dây ... họ là mảng của char :)