Printf में "%। * S" का क्या अर्थ है?


जवाबों:


120

आप प्रारूप स्ट्रिंग में हार्ड कोडिंग के बजाय *चौड़ाई निर्दिष्ट / परिशुद्धता पास करने के लिए एक तारांकन चिह्न ( ) का उपयोग कर सकते हैं printf(), अर्थात

void f(const char *str, int str_len)
{
  printf("%.*s\n", str_len, str);
}

4
यह ध्यान दिया जाना चाहिए कि str_lenतर्क में टाइप int(या संकीर्ण अभिन्न प्रकार, जिसे बढ़ावा दिया जाएगा int) होना चाहिए । यह पारित करने के लिए एक बग होगा long, size_tआदि,
एम एम

10
यह ध्यान देने योग्य है कि इस कोड का संभावित उद्देश्य, विशेषकर जब उपयोग किया जाता है %s, तो मूल स्ट्रिंग के उप-स्ट्रिंग को प्रिंट करना है। इस उपयोग के मामले में, strमूल स्ट्रिंग (संभवतः शुरुआत में) के अंदर कहीं इंगित str_lenकरेगा , और उप-स्ट्रिंग की लंबाई निर्दिष्ट करेगा जिसे मुद्रित किया जाना चाहिए।
ध्वनि एटम

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

23

यहाँ और अधिक विस्तृत ।

पूर्णांक मान या *वह न्यूनतम फ़ील्ड चौड़ाई निर्दिष्ट करता है। परिणाम अंतरिक्ष वर्ण (डिफ़ॉल्ट रूप से) के साथ गद्देदार होता है, यदि आवश्यक हो तो बाईं ओर, जब सही-सही हो, या दाईं ओर से बाएं-उचित हो। मामले में जब * का उपयोग किया जाता है, तो चौड़ाई को int के अतिरिक्त तर्क द्वारा निर्दिष्ट किया जाता है। यदि तर्क का मान ऋणात्मक है, तो इसका परिणाम होता है - ध्वज निर्दिष्ट और धनात्मक क्षेत्र चौड़ाई। (नोट: यह न्यूनतम चौड़ाई है: मूल्य कभी भी छोटा नहीं होता है।)

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

इसलिए यदि हम दोनों रूपांतरण विनिर्देश का प्रयास करते हैं

#include <stdio.h>

int main() {
    int precision = 8;
    int biggerPrecision = 16;
    const char *greetings = "Hello world";

    printf("|%.8s|\n", greetings);
    printf("|%.*s|\n", precision , greetings);
    printf("|%16s|\n", greetings);
    printf("|%*s|\n", biggerPrecision , greetings);

    return 0;
}

हमें आउटपुट मिलता है:

|Hello wo|
|Hello wo|
|     Hello world|
|     Hello world|

12

मुझे नहीं लगता कि उपरोक्त कोड सही है लेकिन (इस विवरण के अनुसार printf()) का .*मतलब है

चौड़ाई प्रारूप स्ट्रिंग में निर्दिष्ट नहीं है, लेकिन एक अतिरिक्त पूर्णांक मान तर्क के रूप में तर्क को पूर्ववर्ती किया जाना है। '

तो यह एक तर्क के रूप में एक निष्क्रिय चौड़ाई के साथ एक स्ट्रिंग है।


2
मैंने URL क्रॉस-संदर्भ जोड़ दिया है ताकि आप साहित्यिक चोरी के आरोपों से बच सकें। बेशक, सही उद्धरण " चौड़ाई नहीं है ..." के बजाय " सटीक नहीं है ..." कहता है ।
जोनाथन लेफ़लर

जैसा कि @MattMcNabb ने बताया, उस पृष्ठ के प्रत्येक संदर्भ को यह उजागर करना चाहिए कि " पूर्णांक मान " वास्तव में int(या इसका एक सबसेट) है - न कि किसी भी अभिन्न मूल्य जैसे अधिक सहज size_tया इसके संभव उपनाम, जैसे std::string::size_type। यह और भी भ्रामक है, इस बात को ध्यान में रखते हुए कि संदर्भित पृष्ठ size_tमें एक समर्थित प्रकार के विशेषकों के रूप में उल्लेख किया गया है।
एंटोन सैमसनोव

10

देखें: http://www.cplusplus.com/reference/clibrary/cstdio/printf/

.* सटीकता को प्रारूप स्ट्रिंग में निर्दिष्ट नहीं किया गया है, लेकिन एक अतिरिक्त पूर्णांक मान तर्क के रूप में उस तर्क से पहले है जिसे प्रारूपित किया जाना है।

s पात्रों का स्ट्रिंग

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.