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?
Trả lời
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.
Cảm ơn câu trả lời nhanh ! – Mike
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'. –
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
'sizeof (char)' là 1 theo định nghĩa. Ngoài ra, 'NULL' là một hằng số null * pointer *. –
@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ứ ;-) –
- 1. Sử dụng printf với chuỗi không bị null
- 2. printf bằng cách sử dụng ngăn xếp?
- 3. arm-no-eabi-gcc: In số phao bằng cách sử dụng printf
- 4. Làm cách nào để in dấu gạch ngang hoặc dấu chấm bằng fprintf/printf?
- 5. Làm cách nào để thêm dòng mới bằng printf?
- 6. printf() gỡ lỗi thư viện bằng cách sử dụng bảng chuỗi "bộ giải mã vòng"
- 7. Khi nào printf không in được?
- 8. cách hủy yêu cầu http bằng cách sử dụng javascript
- 9. In Excel bằng cách sử dụng Interop
- 10. cách thread POSIX con bị hủy
- 11. Làm cách nào để sử dụng mẫu {{in a Moustache "?
- 12. Làm cách nào để cắt chuỗi con khỏi chuỗi ký tự bằng cách sử dụng Javascript?
- 13. Làm cách nào để sử dụng OutputDebugString để in thư có trong biến chuỗi?
- 14. Chuỗi để nổi bằng cách sử dụng chuỗi
- 15. Làm cách nào để in dấu ngoặc kép trong C?
- 16. trong emacs-lisp, làm cách nào để sử dụng đúng chuỗi regexp-in-string?
- 17. Làm cách nào để nhận được thông báo "printf" được viết bằng ứng dụng NDK?
- 18. làm thế nào để in một ngoại lệ bằng cách sử dụng logger?
- 19. Cách sử dụng printf với NSString
- 20. Làm cách nào để hủy bỏ chuỗi lời hứa của node.js bằng Q?
- 21. Làm thế nào để bạn giữ lệnh bằng cách sử dụng SELECT WHERE IN()?
- 22. Làm thế nào để hủy bỏ Visual Studio xây dựng bằng cách sử dụng dòng lệnh?
- 23. cách tốt nhất để bắt "hủy thao tác bằng cách sử dụng" là gì ngoại lệ
- 24. Làm cách nào để in bảng điều khiển bằng màu theo cách đa nền tảng?
- 25. Làm cách nào để sử dụng v8 trong chuỗi?
- 26. In chuỗi bằng cách sử dụng con trỏ với con trỏ trong C
- 27. "printf" trên dây in GIBBERISH
- 28. Làm thế nào để loại bỏ chuỗi con khỏi chuỗi bằng cách sử dụng PHP?
- 29. Hủy đăng ký DLL bằng cách sử dụng regsvr32
- 30. Làm thế nào để in byte trong hệ thập lục phân bằng cách sử dụng System.out.println?
Tại sao không sử dụng fwrite? –
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. –
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