खोज…


एक वस्तु के लिए एक सूचक का मूल्य मुद्रण

किसी ऑब्जेक्ट के लिए पॉइंटर के मान को प्रिंट करने के लिए (फ़ंक्शन पॉइंटर के विपरीत) p रूपांतरण विनिर्देशक का उपयोग करें। इसे केवल void बिंदु प्रिंट करने के लिए परिभाषित किया गया है, इसलिए गैर- void पॉइंटर के मूल्य को प्रिंट करने के लिए इसे स्पष्ट रूप से परिवर्तित करने की आवश्यकता है ("डाली गई *") void* करने के लिए void*

#include <stdlib.h> /* for EXIT_SUCCESS */
#include <stdio.h>  /* for printf() */

int main(void)
{
  int i;
  int * p = &i;

  printf("The address of i is %p.\n", (void*) p);

  return EXIT_SUCCESS;
}
C99

<inttypes.h> और uintptr_t का उपयोग करना

C99 या बाद में पॉइंटर्स प्रिंट करने का एक और तरीका <inttypes.h> से uintptr_t प्रकार और मैक्रो का उपयोग करता है:

#include <inttypes.h> /* for uintptr_t and PRIXPTR */
#include <stdio.h>    /* for printf() */

int main(void)
{
  int  i;
  int *p = &i;

  printf("The address of i is 0x%" PRIXPTR ".\n", (uintptr_t)p);

  return 0;
}

सिद्धांत रूप में, पूर्णांक प्रकार नहीं हो सकता है जो किसी भी सूचक को पूर्णांक में परिवर्तित कर सकता है (इसलिए प्रकार uintptr_t मौजूद नहीं हो सकता है)। व्यवहार में, यह मौजूद है। फ़ंक्शंस के पॉइंटर्स को uintptr_t टाइप में कन्वर्टिबल होने की ज़रूरत नहीं है - हालांकि फिर से वे सबसे अधिक बार कन्वर्टिबल होते हैं।

यदि uintptr_t प्रकार मौजूद है, तो intptr_t प्रकार है। यह स्पष्ट नहीं है कि आप कभी भी हस्ताक्षरित पूर्णांक के रूप में पतों का इलाज क्यों करना चाहते हैं।

के एंड आर C89

पूर्व-मानक इतिहास:

कश्मीर एंड आर सी समय के दौरान C89 से पहले कोई प्रकार नहीं थी void* (और न ही शीर्ष लेख <stdlib.h> , और न ही प्रोटोटाइप, और इसलिए कोई int main(void) अंकन), तो सूचक को कास्ट किया गया था long unsigned int और का उपयोग कर मुद्रित lx लंबाई संशोधक / रूपांतरण विनिर्देशक।

नीचे दिया गया उदाहरण सिर्फ सूचनात्मक उद्देश्य के लिए है। आजकल यह अमान्य कोड है, जो कुख्यात अनिर्धारित व्यवहार को भड़का सकता है।

#include <stdio.h> /* optional in pre-standard C - for printf() */

int main()
{
  int  i;
  int *p = &i;

  printf("The address of i is 0x%lx.\n", (long unsigned) p);

  return 0;
}

एक वस्तु के दो बिंदुओं के मूल्यों के अंतर को मुद्रित करना

एक हस्ताक्षरित पूर्णांक * 1 में एक वस्तु परिणाम के लिए दो संकेत के मूल्यों को घटाना । तो यह कम से कम d रूपांतरण विनिर्देशक का उपयोग करके मुद्रित किया जाएगा।

यह सुनिश्चित करने के लिए कि इस तरह के "पॉइंटर- <stddef.h> " को पकड़ने के लिए एक प्रकार पर्याप्त चौड़ा है, क्योंकि C99 <stddef.h> प्रकार ptrdiff_t को परिभाषित करता है। एक ptrdiff_t प्रिंट करने के लिए t लंबाई संशोधक का उपयोग करें।

C99
#include <stdlib.h> /* for EXIT_SUCCESS */
#include <stdio.h> /* for printf() */
#include <stddef.h> /* for ptrdiff_t */


int main(void)
{
  int a[2];
  int * p1 = &a[0], * p2 = &a[1];
  ptrdiff_t pd = p2 - p1;

  printf("p1 = %p\n", (void*) p1);
  printf("p2 = %p\n", (void*) p2);
  printf("p2 - p1 = %td\n", pd);

  return EXIT_SUCCESS;
}

परिणाम इस तरह दिख सकता है:

p1 = 0x7fff6679f430
p2 = 0x7fff6679f434
p2 - p1 = 1

कृपया ध्यान दें कि अंतर का जिसके परिणामस्वरूप मान प्रकार संकेत करने के लिए, एक बिंदु घटाया के आकार से माप लिया जाता है int यहाँ। इस उदाहरण के लिए एक int का आकार 4 है।


* 1 यदि दो बिंदुओं को घटाया जाए तो एक ही वस्तु की ओर इंगित न करें, व्यवहार अपरिभाषित है।

मुद्रण के लिए रूपांतरण विनिर्देशक

रूपांतरण विनिर्देशक तर्क का प्रकार विवरण
i , d पूर्णांक प्रिंट करता है दशमलव
u अहस्ताक्षरित int प्रिंट करता है दशमलव
o अहस्ताक्षरित int अष्टक प्रिंट करता है
x अहस्ताक्षरित int प्रिंट्स हेक्साडेसिमल, लोअर-केस
X अहस्ताक्षरित int प्रिंट हेक्साडेसिमल, अपर-केस
f दोहरा प्रिंट, 6 की एक डिफ़ॉल्ट परिशुद्धता के साथ तैरने लगते हैं अगर कोई सटीक (लोअर केस विशेष संख्या के लिए इस्तेमाल दिया जाता है nan और inf या infinity )
F दोहरा यदि कोई परिशुद्धता नहीं दी जाती है, तो प्रिंट 6 की डिफ़ॉल्ट परिशुद्धता के साथ तैरते हैं (ऊपरी संख्या विशेष नंबर NAN और INF या INFINITY )
e दोहरा प्रिंट 6 की एक डिफ़ॉल्ट परिशुद्धता के साथ तैरते हैं, अगर कोई परिशुद्धता नहीं दी जाती है, तो मंटिसा / एक्सपोनेंट का उपयोग करके वैज्ञानिक संकेतन का उपयोग किया जाता है; लोअर-केस एक्सपोनेंट और स्पेशल नंबर
E दोहरा प्रिंट 6 की एक डिफ़ॉल्ट परिशुद्धता के साथ तैरते हैं, अगर कोई परिशुद्धता नहीं दी जाती है, तो मंटिसा / एक्सपोनेंट का उपयोग करके वैज्ञानिक संकेतन का उपयोग किया जाता है; अपर-केस एक्सपोनेंट और स्पेशल नंबर
g दोहरा f या e का उपयोग करता है [नीचे देखें]
G दोहरा F या E का उपयोग करता है [नीचे देखें]
a दोहरा प्रिंट्स हेक्साडेसिमल, लोअर-केस
A दोहरा प्रिंट हेक्साडेसिमल, अपर-केस
c चार एकल चरित्र प्रिंट करता है
s चार * NUL टर्मिनेटर तक वर्णों के तार, या यदि निर्दिष्ट हो, तो सटीकता से दी गई लंबाई तक काटे जाते हैं
p शून्य * प्रिंट void -मान मूल्य; एक गैर void सूचक स्पष्ट रूप से ("कास्ट") void* परिवर्तित किया जाना चाहिए void* ; वस्तु नहीं, बल्कि केवल एक समारोह-सूचक को सूचक
% n / a % वर्ण छापता है
n int * बताए गए int में अब तक मुद्रित बाइट्स की संख्या लिखें

ध्यान दें कि लंबाई संशोधक %n लागू किया जा सकता है (उदाहरण के लिए %hhn इंगित करता है कि ISO / IEC 9899: 2011 §7.21.6.1 ¶7 के अनुसार निम्न n रूपांतरण %hhn एक signed char चार्ट तर्क पर लागू होता है )।

ध्यान दें कि फ़्लोटिंग पॉइंट रूपांतरण डिफ़ॉल्ट पदोन्नति नियमों के कारण float और double लागू होते हैं - floating6.5.2.2 फ़ंक्शन फ़ंक्शन कॉल, ips7 फ़ंक्शन प्रोटोटाइप घोषणाकर्ता में दीर्घवृत्त नोटेशन अंतिम अंतिम पैरामीटर के बाद तर्क प्रकार रूपांतरण को रोकने का कारण बनता है। डिफॉल्ट तर्क प्रोन्नति अनुगामी तर्कों पर की जाती है। ) इस प्रकार, इस तरह के रूप में भी कार्य printf() ही कभी पारित कर रहे हैं double मूल्यों, भले ही चर संदर्भित प्रकार की है float

g और G प्रारूपों के साथ, e और f (या E और F ) संकेतन के बीच का विकल्प सी मानक और प्रिंटफ के लिए पोसिक्स विनिर्देश printf() में प्रलेखित है:

डबल तर्क एक फ्लोटिंग प्वाइंट संख्या का प्रतिनिधित्व शैली में परिवर्तित किया जाएगा f या e (या शैली में F या E एक के मामले में G रूपांतरण विनिर्देशक), मूल्य के आधार पर परिवर्तित और सटीक। Let P परिशुद्धता के बराबर है, तो गैर शून्य, 6 यदि परिशुद्धता छोड़ दिया जाता है, या 1 यदि परिशुद्धता शून्य है। फिर, यदि शैली E साथ रूपांतरण X का एक घातांक होगा:

  • यदि P> X> = -4, रूपांतरण शैली f (या F ) और सटीक P - (X+1)
  • अन्यथा, रूपांतरण शैली e (या E ) और सटीक P - 1

अंत में, जब तक '#' ध्वज का उपयोग नहीं किया जाता है, किसी भी अनुगामी शून्य को परिणाम के भिन्नात्मक भाग से हटा दिया जाएगा और यदि कोई भिन्नात्मक भाग शेष नहीं है तो दशमलव बिंदु वर्ण हटा दिया जाएगा।

प्रिंटफ () फ़ंक्शन

के माध्यम से पहुँचा <stdio.h> , फ़ंक्शन printf() C में कंसोल पर टेक्स्ट प्रिंट करने के लिए उपयोग किया जाने वाला प्राथमिक उपकरण है।

printf("Hello world!");
// Hello world!

कोष्ठक के बीच में सीधे रखकर, सामान्य, बिना वर्ण वाले वर्ण सरणियों को स्वयं द्वारा मुद्रित किया जा सकता है।

printf("%d is the answer to life, the universe, and everything.", 42);
// 42 is the answer to life, the universe, and everything.

int x = 3;
char y = 'Z';
char* z = "Example";
printf("Int: %d, Char: %c, String: %s", x, y, z);
// Int: 3, Char: Z, String: Example

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

फ़ंक्शन printf() सभी अतिरिक्त तर्क कॉमा द्वारा अलग किए गए हैं, और ये तर्क उसी क्रम में होने चाहिए, जैसे प्रारूप निर्दिष्टकर्ता। अतिरिक्त तर्कों की अनदेखी की जाती है, जबकि गलत तरीके से टाइप किए गए तर्क या तर्कों की कमी के कारण त्रुटियां या अपरिभाषित व्यवहार होगा। प्रत्येक तर्क या तो शाब्दिक मूल्य या एक चर हो सकता है।

सफल निष्पादन के बाद, मुद्रित किए गए वर्णों की संख्या को int साथ वापस कर दिया जाता है। अन्यथा, विफलता एक नकारात्मक मान लौटाती है।

लंबाई संशोधक

C99 और C11 मानकों में printf() लिए निम्नलिखित लंबाई संशोधक निर्दिष्ट हैं; उनके अर्थ हैं:

संशोधक संशोधित प्र लागू होता है
hh डी, आई, ओ, यू, एक्स, या एक्स char , signed char या unsigned char
डी, आई, ओ, यू, एक्स, या एक्स short int या unsigned short int
एल डी, आई, ओ, यू, एक्स, या एक्स long int या unsigned long int
एल ए, ए, ई, ई, एफ, एफ, जी, या जी double ( scanf() के साथ संगतता के लिए scanf() , C90 में अपरिभाषित
डालूँगा डी, आई, ओ, यू, एक्स, या एक्स long long int या unsigned long long int
जे डी, आई, ओ, यू, एक्स, या एक्स intmax_t या uintmax_t
z डी, आई, ओ, यू, एक्स, या एक्स size_t या संबंधित हस्ताक्षरित प्रकार (POSIX में ssize_t )
टी डी, आई, ओ, यू, एक्स, या एक्स ptrdiff_t या संबंधित अहस्ताक्षरित पूर्णांक प्रकार
एल ए, ए, ई, ई, एफ, एफ, जी, या जी long double

यदि एक लंबाई संशोधक ऊपर निर्दिष्ट के अलावा किसी भी रूपांतरण विनिर्देशक के साथ प्रकट होता है, तो व्यवहार अपरिभाषित है।

Microsoft कुछ अलग लंबाई संशोधक निर्दिष्ट करता है, और स्पष्ट रूप से hh , j , z , या t समर्थन नहीं करता t

संशोधक संशोधित प्र लागू होता है
I32 डी, आई, ओ, एक्स, या एक्स __int32
I32 ओ, यू, एक्स, या एक्स unsigned __int32
I64 डी, आई, ओ, एक्स, या एक्स __int64
I64 ओ, यू, एक्स, या एक्स unsigned __int64
मैं डी, आई, ओ, एक्स, या एक्स ptrdiff_t (यह है कि, __int32 32-बिट प्लेटफार्मों पर, __int64 64-बिट प्लेटफॉर्म पर)
मैं ओ, यू, एक्स, या एक्स size_t (यह है कि, unsigned __int32 32-बिट प्लेटफार्मों पर, unsigned __int64 64-बिट प्लेटफॉर्म पर)
एल या एल ए, ए, ई, ई, एफ, जी, या जी long double (इन विजुअल C ++, हालांकि long double एक अलग प्रकार है, इसमें double के समान आंतरिक प्रतिनिधित्व है।)
एल या डब्ल्यू सी या सी printf और wprintf फ़ंक्शन के साथ विस्तृत वर्ण। (एक lc , lC , wc या wC प्रकार निर्दिष्टकर्ता पर्याय बन गया है C में printf कार्य करता है और साथ c में wprintf कार्य करता है।)
एल या डब्ल्यू एस, एस, या जेड printf और wprintf फ़ंक्शन के साथ वाइड-कैरेक्टर स्ट्रिंग। (एक ls , lS , ws या wS प्रकार निर्दिष्टकर्ता पर्याय बन गया है S में printf कार्य करता है और साथ s में wprintf कार्य करता है।)

ध्यान दें कि C , S और Z रूपांतरण विनिर्देशक और I , I32 , I64 और w लंबाई संशोधक Microsoft एक्सटेंशन हैं। इलाज l के लिए एक आपरिवर्तक के रूप में long double बजाय double मानक से अलग है, हालांकि आप बहुत मुश्किल है जब तक कि अंतर को पहचानना होगा long double से एक अलग प्रतिनिधित्व है double

मुद्रण प्रारूप झंडे

C मानक (C11, और C99 भी) printf() लिए निम्नलिखित झंडे को परिभाषित करता है:

झंडा रूपांतरण अर्थ
- सब रूपांतरण का परिणाम क्षेत्र के भीतर छोड़ दिया जाएगा। यदि यह ध्वज निर्दिष्ट नहीं है तो रूपांतरण उचित है।
+ हस्ताक्षरित अंक एक हस्ताक्षरित रूपांतरण का परिणाम हमेशा एक संकेत ('+' या '-') के साथ शुरू होगा। रूपांतरण केवल एक संकेत के साथ शुरू होगा, जब यह ध्वज निर्दिष्ट नहीं होने पर एक नकारात्मक मूल्य परिवर्तित हो जाएगा।
<space> हस्ताक्षरित अंक यदि किसी हस्ताक्षरित रूपांतरण का पहला वर्ण कोई संकेत नहीं है या यदि कोई हस्ताक्षरित रूपांतरण बिना वर्णों में परिणत होता है, तो परिणाम के लिए <space> को उपसर्ग किया जाएगा। इसका अर्थ है कि यदि <space> और ' + ' दोनों झंडे दिखाई देते हैं, तो <space> ध्वज को अनदेखा किया जाएगा।
# सब निर्दिष्ट करता है कि मान को वैकल्पिक रूप में परिवर्तित किया जाना है। o रूपांतरण के लिए, यह सटीकता को बढ़ाएगा, यदि और केवल यदि आवश्यक हो, तो परिणाम के पहले अंक को शून्य होने के लिए मजबूर करने के लिए (यदि मूल्य और परिशुद्धता दोनों 0 हैं, तो एक एकल 0 मुद्रित है)। x या X रूपांतरण विनिर्देशकों के लिए, एक गैर-शून्य परिणाम में 0x (या 0X ) होगा, जो इसके लिए उपसर्ग है। के लिए a , A , e , E , f , F , g , और G रूपांतरण विनिर्देशक, परिणाम हमेशा एक मूलांक चरित्र शामिल होगा, भले ही कोई अंक मूलांक चरित्र का अनुसरण करें। इस ध्वज के बिना, एक मूलांक वर्ण इन रूपांतरणों के परिणाम में तभी प्रकट होता है जब कोई अंक इसका अनुसरण करता है। g और G रूपांतरण विनिर्देशक के लिए, अनुगामी शून्य को परिणाम से हटाया नहीं जाएगा क्योंकि वे सामान्य रूप से हैं। अन्य रूपांतरण विनिर्देशकों के लिए, व्यवहार अपरिभाषित है।
0 संख्यात्मक डी, आई, ओ, यू, एक्स, एक्स, ए, ए, ई, ई, एफ, एफ, जी, और जी रूपांतरण विनिर्देशक, अग्रणी शून्य (साइन या आधार के किसी भी संकेत के बाद) का उपयोग फ़ील्ड में पैड के लिए किया जाता है अंतरिक्ष पैडिंग प्रदर्शन करने के बजाय चौड़ाई, एक अनंत या NaN परिवर्तित करते समय। यदि '0' और '-' दोनों झंडे दिखाई देते हैं, तो '0' ध्वज को नजरअंदाज कर दिया जाता है। D, i, o, u, x, और X रूपांतरण विनिर्देशक के लिए, यदि कोई सटीक निर्दिष्ट किया जाता है, तो '0' ध्वज को अनदेखा किया जाएगा। ⌦ यदि '0' और <apostrophe> झंडे दोनों दिखाई देते हैं, तो समूह के अक्षर शून्य गद्दी से पहले डाले जाते हैं। अन्य रूपांतरणों के लिए, व्यवहार अपरिभाषित है। ⌫

ये ध्वज Microsoft द्वारा समान अर्थों के साथ समर्थित हैं।

POSIX विनिर्देशन के लिए printf() जोड़ता है:

झंडा रूपांतरण अर्थ
' मैं, डी, यू, एफ, एफ, जी, जी दशमलव रूपांतरण के परिणाम का पूर्णांक भाग हज़ारों समूहन वर्णों के साथ स्वरूपित किया जाएगा। अन्य रूपांतरणों के लिए व्यवहार अपरिभाषित है। गैर-मौद्रिक समूहन चरित्र का उपयोग किया जाता है।


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow