Câu trả lời:
Bạn có thể thoát nó bằng cách đăng một '%' như thế này: %%
Sử dụng ví dụ của bạn:
printf("hello%%");
Dấu thoát '%' chỉ dành cho printf. Nếu bạn làm:
char a[5];
strcpy(a, "%%");
printf("This is a's value: %s\n", a);
Nó sẽ in: This is a's value: %%
%
này là cụ thể printf
, đúng không?
\045
là lối thoát thời gian biên dịch là một phần của ngôn ngữ và sẽ biến thành %
khi biên dịch. printf
là một hàm thời gian chạy, do đó, nó xử lý các byte của chuỗi của bạn, không phải với mã nguồn C và nó có các chuỗi thoát riêng của nó là một phần của hàm . Nói tóm lại, printf
là một "ngôn ngữ bên trong một ngôn ngữ" và printf("This is a's value: %s\n", a);
cho kết quả tương tự như printf("This is a's value: \045\0163\012", a);
.
printf("hello%c", '%');
. Tuy nhiên, %%
tốt hơn bởi vì nó không sử dụng đối số khác.
Như những người khác đã nói, %% sẽ thoát khỏi%.
Lưu ý, tuy nhiên, bạn không bao giờ nên làm điều này:
char c[100];
char *c2;
...
printf(c); /* OR */
printf(c2);
Bất cứ khi nào bạn phải in một chuỗi, luôn luôn, luôn luôn, luôn luôn in nó bằng cách sử dụng
printf("%s", c)
để ngăn% nhúng gây ra sự cố [vi phạm bộ nhớ, segfault, v.v.]
Nếu không có định dạng trong chuỗi, bạn có thể sử dụng puts
(hoặc fputs
):
puts("hello%");
nếu có một định dạng trong chuỗi:
printf("%.2f%%", 53.2);
Như đã lưu ý trong các ý kiến, puts
nối thêm một \n
đầu ra và fputs
không.
puts
. Tôi chưa bao giờ nghĩ đến puts
việc in chuỗi và nhảy thẳng đến printf
. Không còn nữa.
Với chính nó ...
printf("hello%%"); /* like this */
Nitpick:
Bạn không thực sự thoát khỏi %
chuỗi xác định định dạng cho họ hàm printf()
(và scanf()
).
Các %
, trong printf()
(và scanf()
) gia đình của các chức năng, bắt đầu một đặc điểm kỹ thuật chuyển đổi. Một trong những quy tắc cho đặc tả chuyển đổi nói rằng một công %
cụ xác định chuyển đổi (ngay sau khi %
bắt đầu đặc tả chuyển đổi) làm cho một '%'
ký tự được viết không có đối số được chuyển đổi.
Chuỗi thực sự có 2 '%'
ký tự bên trong (trái ngược với các ký tự thoát: "a\bc"
là một chuỗi có 3 ký tự không null; "a%%b"
là một chuỗi có 4 ký tự không null).
Dấu gạch chéo ngược trong C được sử dụng để thoát các ký tự trong chuỗi. Các chuỗi sẽ không nhận ra% là một ký tự đặc biệt và do đó không cần thoát. Printf là một vấn đề khác: sử dụng %% để in một%.
Bạn có thể dùng %%:
printf("100%%");
Kết quả là:
100%
bạn đang sử dụng công cụ xác định định dạng không chính xác mà bạn nên sử dụng %%
để in %
. Mã của bạn phải là:
printf("hello%%");
Đọc thêm bài specifiers dạng được sử dụng trong C .
Bạn chỉ có thể sử dụng %
hai lần, đó là"%%"
Thí dụ:
printf("You gave me 12.3 %% of profit");
Các đôi '%' cũng hoạt động trong ".Format (...) Ví dụ (với iDrawApertureMask == 87, fCornerRadMask == 0,05):.
csCurrentLine.Format("\%ADD%2d%C,%6.4f*\%",iDrawApertureMask,fCornerRadMask) ;
Cho giá trị mong muốn và kỳ vọng của (nội dung chuỗi trong) csCurrentLine;" % ADD87C, 0,0500 *% "