อะไรคือความแตกต่างระหว่างตัวระบุการแปลง% i และ% d ในฟังก์ชั่นการจัดรูปแบบ IO (* printf / * scanf)


คำตอบ:


276

printfพวกเขาเป็นคนเดียวกันเมื่อนำมาใช้สำหรับการส่งออกเช่นกับ

อย่างไรก็ตามสิ่งเหล่านี้จะแตกต่างกันเมื่อใช้เป็นตัวระบุอินพุตเช่นด้วยscanfโดยที่%dสแกนเลขจำนวนเต็มเป็น%iเลขฐานสิบที่ลงนามแล้ว แต่ค่าเริ่มต้นเป็นทศนิยม แต่ยังอนุญาตเลขฐานสิบหก (หากนำหน้าด้วย0x) และฐานแปด (หากนำหน้าด้วย0)

ดังนั้น033จะเป็น 27 %iแต่ 33 %dพร้อมด้วย


8
การคาดหวัง int ด้วยการเติม zero-padding ที่เป็นไปได้ใน sscanf นั้นดูเหมือนว่าฉันจะเป็นพฤติกรรมเริ่มต้นที่สมเหตุสมผลที่สุด หากคุณไม่คาดหวัง Octal นั่นอาจทำให้เกิดข้อบกพร่องเล็กน้อย ดังนั้นสิ่งนี้ชี้ให้เห็นว่า% d เป็นตัวระบุที่ดีที่จะใช้เมื่อคุณต้องเลือกหนึ่งข้อยกเว้นถ้าคุณต้องการอ่านฐานแปดและ / หรือฐานสิบหกอย่างชัดเจน
เอเลียต

2
อา! นั่นทำให้รู้สึก! ตอนนี้ฉันรู้ว่าสิ่งที่จะมองหานี้ยังสามารถเห็นได้ในเอกสารประกอบการและprintf scanf
Gabriel Staples

67

เหล่านี้เป็นเหมือนแต่แตกต่างกันสำหรับprintf scanfสำหรับprintfทั้ง%dและ%iกำหนดจำนวนเต็มทศนิยมที่ลงนาม สำหรับscanf, %dและ%iยังหมายถึงการลงนามจำนวนเต็ม แต่%iinteprets การป้อนข้อมูลที่เป็นเลขฐานสิบหกถ้านำหน้าด้วย0xและฐานแปดถ้านำหน้าด้วย0และอื่น ๆ ตีความการป้อนข้อมูลที่เป็นทศนิยม


20

มีความแตกต่างระหว่างไม่เป็น%iและ%dspecifiers printfรูปแบบ เราสามารถเห็นสิ่งนี้ได้โดยไปที่ร่างมาตรามาตรฐาน C99 7.19.6.1 ฟังก์ชั่น fprintfซึ่งครอบคลุมprintfเกี่ยวกับตัวระบุรูปแบบและอธิบายในย่อหน้าที่8 :

ตัวระบุการแปลงและความหมายของมันคือ:

และรวมถึงสัญลักษณ์แสดงหัวข้อต่อไปนี้:

d,i     The int argument is converted to signed decimal in the style
        [−]dddd. The precision specifies the minimum number of digits to
        appear; if the value being converted can be represented in fewer
        digits, it is expanded with leading zeros. The default precision is
        1. The result of converting a zero value with a precision of zero is
        no characters.

ในทางกลับกันหากscanfมีความแตกต่างให้%dถือว่าฐาน 10 ขณะที่%iตรวจจับฐาน เราสามารถเห็นสิ่งนี้ได้โดยไปที่ส่วน7.19.6.2 ฟังก์ชั่น fscanfซึ่งครอบคลุมscanfเกี่ยวกับตัวระบุรูปแบบในวรรค12มันบอกว่า:

ตัวระบุการแปลงและความหมายของมันคือ:

และรวมถึงต่อไปนี้:

d     Matches an optionally signed decimal integer, whose format is the
      same as expected for the subject sequence of the strtol function with
      the value 10 for the base argument. The corresponding argument shall
      be a pointer to signed integer.

i     Matches an optionally signed integer, whose format is the same as
      expected for the subject sequence of the strtol function with the
      value 0 for the base argument. The corresponding argument shall be a
      pointer to signed integer.

4

ไม่มีในprintf- ทั้งสองมีความหมายเหมือนกัน


6
มีความแตกต่างเมื่อใช้ในscanf()สตริงรูปแบบตามที่คำตอบที่ยอมรับบอกว่า
เจ ...
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.