Làm cách nào để thoát dấu% (phần trăm) trong printf của C?


274

Làm thế nào để bạn thoát dấu% khi sử dụng printftrong C?

printf("hello\%"); /* not like this */

Câu trả lời:


421

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: %%


8
"printf (" xin chào %% ");" đúng. Nhưng nó không phải là một lối thoát tôi nghĩ. sử dụng printf ("xin chào \ 045");
Lai Giang Sơn

1
@Pablo Santa Cruz: phương pháp "thoát" %này là cụ thể printf, đúng không?
Lazer

10
Đây là trường hợp đặc biệt của quy tắc rất phổ biến trong các hệ thống thoát hiểm để có được biểu tượng thoát theo nghĩa đen, bạn sử dụng <biểu tượng thoát> <biểu tượng thoát>.
dmckee --- ex-moderator mèo con

12
Lai Jiang Sơn, điều này sẽ không làm việc. \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);.
Triang3l

5
Ngoài ra, bạn có thể làm điều này : printf("hello%c", '%');. Tuy nhiên, %%tốt hơn bởi vì nó không sử dụng đối số khác.
Triang3l

36

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.]


Cảnh báo nói chung là phù hợp tuy nhiên có thể có những tình huống bạn muốn thực hiện "điều này" - miễn là bạn biết rằng chuỗi bạn cung cấp sẽ được hiểu là một chuỗi định dạng.
PP.

2
Tôi đã đưa ra một giải pháp thay thế một lần - sao chép bộ đệm sang bộ đệm khác và sau đó đi qua nó nhân đôi các dấu%. Cuối cùng tôi đã bắt gặp ý tưởng này và thay thế một hàm 20-30 bằng một dòng. Đừng lo lắng, tôi đã tự đánh mình nặng nề về cái đầu, như tôi xứng đáng.
Graeme Perrow

Đúng, nhưng đừng quên rằng 99% khi bạn nhận được một chuỗi định dạng, bạn sẽ nhận được các đối số dưới dạng va_list, vì vậy bạn cần sử dụng vprintf. Do đó, tôi đúng về mặt kỹ thuật;)
Mikeage 7/12/2016

2
Nó dễ dàng hơn nhiều để làm (c). Nếu
William Pursell

1
đặt thêm một dòng mới. Đó thường là hành vi không mong muốn.
Mikeage

33

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.


4
Cũng đáng đề cập đến fputs (), vì nó trực tiếp đáp ứng với fprintf ().
Tim Post

1
đặt cũng nối thêm một dòng mới [ngay cả khi bạn đã có]. Nếu bạn muốn điều đó, thật tuyệt. Mặt khác ...
Mikeage

@Sinan nür: cảm ơn đã nhắc nhở tôi về 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.
Lazer


7

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).


2
về mặt công nghệ, nó vẫn "thoát"; các nhân vật đặc biệt cần một cách để "thoát khỏi" ý nghĩa đặc biệt của họ và trở lại với "bản chất nhân vật" của họ
ShinTakezou


4

Như thế này:

printf("hello%%");
//-----------^^ inside printf, use two percent signs together

3

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%.




2

Yup, sử dụng printf ("xin chào %%"); và nó đã được thực hiện.


2

Bạn chỉ có thể sử dụng %hai lần, đó là"%%"

Thí dụ:

printf("You gave me 12.3 %% of profit");

1

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 *% "

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.