2013-07-23 55 views
17

Các tài liệu printf() nói rằng nếu ai đó muốn in % trong C, ông có thể sử dụng:Tại sao phần trăm ký tự không được thoát bằng dấu gạch chéo ngược trong C?

printf("%%") 

Tại sao nó không:

printf("\%") 

như với các nhân vật đặc biệt khác?

+1

Khám phá liên kết này để biết thêm thông tin; http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.cmds/doc/aixcmds4/printf.htm – JNL

+1

Đây chỉ là cách printf. Tôi muốn sử dụng tham chiếu này http://www.cplusplus.com/reference/cstdio/printf/ – GreenScape

Trả lời

28

% được xử lý bởi printf. Nó không phải là một ký tự đặc biệt trong C, nhưng tự nó xử lý nó một cách khác nhau.

35

Dấu gạch chéo ngược được xử lý bởi trình biên dịch khi diễn giải văn bản nguồn của chương trình. Vì vậy, kết quả chung là văn bản nguồn "\%" tạo chuỗi chứa "%".

Chuỗi định dạng được diễn giải theo thông lệ printf, do đó, quy trình xử lý các ký tự được chuyển đến nó. Bởi thời gian này, dấu gạch chéo ngược không còn hiện diện, do đó, printf không bao giờ nhìn thấy nó.

Về mặt kỹ thuật, \% không hợp pháp trong chuỗi ký tự. Nhân vật \ bắt đầu một dãy thoát, và chuỗi thoát hợp pháp duy nhất được liệt kê trong C 2011 6.4.4.4 1. Họ là \ tiếp theo ', ", ?, \, a, b, f, n, r, t, v , một đến ba chữ số bát phân, x và các chữ số thập lục phân, u và bốn chữ số thập lục phân hoặc U và tám chữ số thập lục phân.

Nếu printf đã được thiết kế sao cho một dấu chéo ngược sẽ thoát khỏi phần trăm, sau đó bạn sẽ phải vượt qua nó một dấu chéo ngược bằng cách thoát khỏi dấu chéo ngược trong văn bản gốc, do đó bạn sẽ phải viết:

printf("\\%"); 
+1

+1 cho từ ngữ cẩn thận của "x và chữ số thập lục phân" http: // stackoverflow.com/questions/5784969/khi-đã-c-trình biên dịch-bắt đầu-xem-nhiều-hơn-hai-hex-chữ-in-string-lite – chux

3

Quy ước là các nhân vật đặc biệt tự trốn thoát. Vì vậy, thay vì sử dụng dấu gạch chéo ngược để thoát khỏi phần trăm, nó tự thoát. (Lưu ý rằng để vượt qua dấu gạch chéo ngược đến printf, bạn phải viết chuỗi ký tự là "\\%".)

+0

Quy ước được sử dụng với '\' bởi trình biên dịch và '%' bởi printf là những nhân vật đó thoát khỏi chính họ. Quy ước trong chuỗi ký tự và ký tự chuỗi là dấu gạch chéo ngược được sử dụng để thoát khỏi dấu phân cách kết thúc. Cá nhân, tôi tin rằng tốt nhất là nên có đại diện thoát của một nhân vật trốn thoát là nhân vật đó theo sau là một cái gì đó * khác *; và tránh việc trốn thoát giống như những thứ khác, nhưng ý tưởng nhân đôi nhân vật thoát và những thứ trước như dấu ngoặc kép có dấu thoát (thay vì sử dụng '\ q' như một trích dẫn thoát) có vẻ khá phổ biến. – supercat

+0

Trong chuỗi ký tự và ký tự, điều này cũng áp dụng, dấu gạch chéo ngược là metacharacter và nó tự thoát; các ký tự ngoặc kép không tự thoát ra bằng hầu hết các ngôn ngữ, thay vào đó dấu gạch chéo ngược được sử dụng cho điều đó. Tôi nghĩ bạn đồng ý với tôi? Có một số sơ đồ kỳ quặc, nơi các dấu ngoặc kép được sử dụng để biểu thị các dấu ngoặc kép (UTR35 lưu ý đến như một ví dụ về điều đó, và đó là một cơn ác mộng thực sự). –

+0

Nhân đôi siêu ký tự đại diện cho bản thân là một kiểu chung, mặc dù tôi không biết bất kỳ lợi thế thực sự nào ngoài việc nổi tiếng, vì nó có nghĩa là người ta không thể biết một nhân vật cụ thể có nghĩa là gì mà không thể nhìn thấy một số ký tự tùy ý nó. Có biểu diễn thoát cho '\' là '\!' Sẽ tránh sự mơ hồ về một chuỗi có vẻ kết thúc bằng '\\\ 'có nghĩa là [là trích dẫn một phần thoát của chuỗi hay không? Các ngôn ngữ khác sử dụng một số cách tiếp cận khác nhau, mặc dù đôi khi chúng tạo ra sự mơ hồ của chúng (ví dụ: chuỗi định dạng .NET). – supercat

0

Bạn có thể làm điều đó !!!!!

#include <iostream> 
#include <string> 
#include "stdio.h" 
using namespace std; 



int main(int argc, char **argv) 
{ 


    printf("hhhhhhh %s \n","\%"); 
    printf("hhhhhhh \n"); 

    return 0; 
} 

Vấn đề tồn tại với printf và khác với trình biên dịch bạn sử dụng .. Với wxWidget lib bạn không thể sử dụng printf với hai chuỗi thoát

printf(" xxxxxx \0x81 xx \0x82 xx \n"); 

don t đi. Nhưng nếu bạn sử dụng

printf(" xxxxxx %s xx %s \n","\0x81","\0x82"); 

bạn đã đúng. A plus

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