2015-10-02 5 views
9

printf() साथ "zd" के प्रयोग पर स्पष्टीकरण के लिए देख रहे हैं।`printf()` के साथ "zd" विनिर्देशक का उपयोग कैसे करें?

निश्चित रूप से निम्नलिखित C99 और बाद में साथ सही है।

void print_size(size_t sz) { 
    printf("%zu\n", sz); 
} 

सी कल्पना printf("%zd\n", sz) यह कैसे पढ़ा जाता है पर पर निर्भर करता है की अनुमति देते हैं लगता है:

7.21.6.1 fprintf समारोह

z निर्दिष्ट करता है कि एक निम्नलिखित d, i, o, u, x, या X रूपांतरण विनिर्देशक ०१२३२३४७१२६ पर लागू होता हैया संबंधित हस्ताक्षरित पूर्णांक प्रकार तर्क; या कि एक के बाद n रूपांतरण विनिर्देशक एक हस्ताक्षरित पूर्णांक size_t तर्क करने के लिए इसी प्रकार के सूचक के लिए लागू होता है। C11dr §7.21.6.1 7

इस

  1. के रूप में पढ़ा जाना चाहिए "z निर्दिष्ट करता है कि एक निम्नलिखित d ... रूपांतरण विनिर्देशक size_t या इसी पर हस्ताक्षर किए पूर्णांक प्रकार तर्क पर लागू होता है ..." (दोनों प्रकार के) और "z निर्दिष्ट करता है कि एक निम्नलिखित u ... रूपांतरण विनिर्देशक size_t या इसी पर हस्ताक्षर किए पूर्णांक प्रकार तर्क पर लागू होता है ..." (दोनों प्रकार के)

या

  1. "z निर्दिष्ट करता है कि एक निम्नलिखित d ... रूपांतरण विनिर्देशक इसी पर हस्ताक्षर किए पूर्णांक प्रकार तर्क पर लागू होता है ..." (पर हस्ताक्षर किए प्रकार केवल) और "z निर्दिष्ट करता है कि एक निम्नलिखित u ... रूपांतरण विनिर्देशक size_t "(अहस्ताक्षरित प्रकार केवल) पर लागू होता है।

मैं # 2 परिभाषा का उपयोग कर रहा हूं, लेकिन अब यह सुनिश्चित नहीं है।

जो सही है, 1, 2, या कुछ और?

तो # 2 सही है, क्या एक प्रकार "%zd" उपयोग कर सकते हैं कि का एक उदाहरण है?

उत्तर

12

एक "%zd" प्रारूप के साथ printf पर हस्ताक्षर किए प्रकार है कि अहस्ताक्षरित प्रकार size_t से मेल खाती है की एक बहस की उम्मीद है।

मानक सी इस प्रकार के लिए नाम प्रदान नहीं करता है या यह निर्धारित करने का एक अच्छा तरीका है कि यह क्या है।यदि size_tunsigned long के लिए टाइप किया गया है, उदाहरण के लिए, "%zd"long प्रकार के तर्क की अपेक्षा करता है, लेकिन यह एक पोर्टेबल धारणा नहीं है।

मानक के लिए आवश्यक है कि संबंधित हस्ताक्षरित और हस्ताक्षरित प्रकार गैर-ऋणात्मक मानों के लिए समान प्रतिनिधित्व का उपयोग करें जो दोनों प्रकारों में प्रतिनिधित्व योग्य है। एक फुटनोट कहता है कि इसका मतलब यह है कि वे कार्य तर्क के रूप में विचलित हैं। तो यह:

size_t s = 42; 
printf("s = %zd\n", s); 

काम करना चाहिए, और "42" प्रिंट करना चाहिए। यह हस्ताक्षर किए गए प्रकार size_t के 42 मान की व्याख्या करेगा, जैसे कि यह संबंधित हस्ताक्षरित प्रकार के थे। लेकिन ऐसा करने के लिए वास्तव में कोई अच्छा कारण नहीं है, क्योंकि "%zu" अतिरिक्त भाषा नियमों का उपयोग किए बिना भी सही और अच्छी तरह परिभाषित है। और "%zu"सभी प्रकार size_t के मानों के साथ काम करता है, जिसमें संबंधित हस्ताक्षरित प्रकार की सीमा के बाहर भी शामिल है।

अंत में, POSIX शीर्षलेख शीर्षलेख <unistd.h> और <sys/types.h> में परिभाषित करता है। हालांकि POSIX स्पष्ट रूप से ऐसा नहीं कहता है, संभवतः ssize_tsize_t से संबंधित हस्ताक्षरित प्रकार होगा। तो यदि आप POSIX- विशिष्ट कोड लिख रहे हैं, "%zd" (संभवतः) ssize_t प्रकार के प्रिंटिंग मानों के लिए सही प्रारूप है।

+0

"मानक सी नहीं करते हैं" टी इस प्रकार के लिए एक नाम या यह निर्धारित करने का एक अच्छा तरीका है कि यह क्या है। " यह सब कहता है। – chux

+0

@ एमके .: यह अजीब है। यह कहता है कि आपने 2 घंटे पहले अपना जवाब संपादित किया था (मैं उस पर ऑब्जेक्ट नहीं करता) और शरीर में 2 अक्षर हटा दिए, लेकिन मुझे कोई बदलाव नहीं दिख रहा है। –

+1

@ किथ थॉम्पसन हाँ मुझे करना था। यह मुझे ऊपर वोट के साथ डाउनवोट को प्रतिस्थापित करने की अनुमति नहीं देगा क्योंकि यह 2 घंटे का है। जो पूरी तरह से मूर्ख है क्योंकि मैं संपादित और बदल सकता हूं। मैंने मेटा से उन लोगों की सीमा को हटाने के लिए कहा जिनके पास संपादन करने के लिए पर्याप्त प्रतिनिधि हैं, लेकिन यह कहीं भी नहीं गया। परिवर्तन लिंक फुटनोट्स से पहले अतिरिक्त खाली रेखा को हटा रहा था जो प्रदर्शित नहीं होते हैं, इसलिए आप इसे नहीं देख सकते (मैंने ईमानदारी से एक सार्थक संपादन के साथ आने का प्रयास किया लेकिन जवाब बहुत अच्छा था :) –

0

मैंने जो परीक्षण किया है, उसके अनुसार, "zd" हमेशा सत्य है, लेकिन "zu" नकारात्मक संख्याओं के लिए काम नहीं करता है।

टेस्ट कोड:

#include <stdio.h> 
    int main (void) 
    { int i; 
    size_t uzs = 1; 
    ssize_t zs = -1; 
    for (i= 0; i<5 ;i++, uzs <<= 16,zs <<= 16) 
    { 
     printf ("%zu\t", uzs); /*true*/ 
     printf ("%zd\t", uzs); /*true*/ 

     printf ("%zu\t", zs); /* false*/ 
     printf ("%zd\n", zs); /*true*/ 
    } 
    return 0; 
} 
+1

"सत्य" और "झूठी" के बारे में क्या है? –

+0

सत्य एक अपेक्षित (सही) उत्तर के लिए है) –

+0

परीक्षण के लिए धन्यवाद, लेकिन कुछ '' zd "हमेशा सत्य है '' uzs'' SIZE_MAX' की तरह बड़ा होने पर विफल हो जाएगा। – chux

संबंधित मुद्दे