2010-01-26 34 views
48

Làm thế nào tôi có thể in một chuỗi không bị vô hiệu bằng cách sử dụng printf, giả sử rằng tôi biết độ dài của chuỗi khi chạy?Làm cách nào để in chuỗi không bị hủy bằng cách sử dụng printf?

+3

Tại sao không sử dụng fwrite? –

+4

Nếu nó không phải là null chấm dứt, sau đó theo định nghĩa nó không phải là một chuỗi. –

+3

nó chỉ không phải là một _c string_, vì nó sẽ là một chuỗi hợp lệ trong các ngôn ngữ khác .. và mặc dù một "không null-chấm dứt mảng char" sẽ chính xác hơn, tôi khá chắc chắn nó đã được hiểu rộng rãi. – Willdorf

Trả lời

81
printf("%.*s", length, string); 

Sử dụng cùng với args khác:

printf("integer=%d, string=%.*s, number=%f", integer, length, string, number); 
//       ^^^^      ^^^^^^^^^^^^^^ 

Trong C bạn có thể xác định độ dài tối đa cho đầu ra với các định dạng %.123s. Điều này có nghĩa là độ dài đầu ra tối đa là 123 ký tự. 123 có thể được thay thế bằng *, do đó độ dài sẽ được lấy từ đối số của printf thay vì mã hóa cứng.

Lưu ý rằng điều này giả định các string không chứa bất kỳ byte null nội thất (\ 0), như %.123s chỉ làm hạn chế độ dài tối đa không phải là chiều dài chính xác , và dây vẫn được coi là null-chấm dứt.

Nếu bạn muốn in một chuỗi không bị vô hiệu bằng null, bạn không thể sử dụng một printf duy nhất. Sử dụng fwrite thay thế:

fwrite(string, 1, length, stdout); 

Xem @M.S.Dousti's answer để được giải thích chi tiết.

+0

Cảm ơn câu trả lời nhanh ! – Mike

+5

lưu ý: 'length' phải có loại' int' tại đây, sau khi quảng cáo đối số mặc định. Nếu biến 'length' của bạn lớn hơn (ví dụ' size_t'), bạn nên đặt nó vào '(int)' nếu không mã của bạn sẽ bị phá vỡ trên nền tảng 'size_t' rộng hơn' int'. –

13

Câu trả lời được cung cấp bởi @KennyTM rất tuyệt vời, nhưng với sự tinh tế.

Nói chung, nếu chuỗi không null "chấm dứt", nhưng có một ký tự rỗng ở giữa, printf("%.*s", length, string); không hoạt động như mong đợi. Điều này là do chuỗi định dạng %.*s yêu cầu printf để in số tối đa của length ký tự, chứ không phải chính xáclength ký tự.

Tôi muốn sử dụng các giải pháp tổng quát hơn đã chỉ ra bởi @William Pursell trong một chú thích dưới OP:

fwrite(string, sizeof(char), length, stdout); 

Dưới đây là một số mẫu mã:

#include <stdio.h> 

int main(void) { 
    size_t length = 5; 

    char string[length]; 
    string[0] = 'A'; 
    string[1] = 'B'; 
    string[2] = 0;  // null character in the middle 
    string[3] = 'C'; 
    string[4] = 'D'; 

    printf("With printf: %.*s\n", length, string); 
    printf("With fwrite: "); 
    fwrite(string, sizeof(char), length, stdout); 
    printf("\n"); 

    return 0; 
} 

Output:

With printf: AB 
With fwrite: AB CD 
+1

'sizeof (char)' là 1 theo định nghĩa. Ngoài ra, 'NULL' là một hằng số null * pointer *. –

+0

@KeithThompson, 'sizeof (char)' là ngữ nghĩa hơn. Ngoài ra, ''\ 0'' có ngữ nghĩa nhiều hơn' 0'. Nhưng ai quan tâm chứ ;-) –

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