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?
\045là 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. printflà 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, printflà 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, putsnối thêm một \nđầu ra và fputskhông.
puts. Tôi chưa bao giờ nghĩ đến putsviệ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 *% "