क्या यह निर्दिष्ट करने का कोई तरीका है कि प्रिंटफ () का उपयोग करके स्ट्रिंग के कितने अक्षर प्रिंट करना है?


127

क्या यह निर्दिष्ट करने का एक तरीका है कि स्ट्रिंग के कितने वर्ण प्रिंट करने के लिए हैं ( ints में दशमलव स्थानों के समान )?

printf ("Here are the first 8 chars: %s\n", "A string that is more than 8 chars");

इसे प्रिंट करना चाहेंगे: Here are the first 8 chars: A string

जवाबों:


226

मूल तरीका है:

printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");

अन्य, अक्सर अधिक उपयोगी, तरीका है:

printf ("Here are the first %d chars: %.*s\n", 8, 8, "A string that is more than 8 chars");

यहां, आप प्रिंटफ़ () के लिए एक आंतरिक तर्क के रूप में लंबाई निर्दिष्ट करते हैं, जो प्रारूप में '*' को एक तर्क से लंबाई प्राप्त करने के अनुरोध के रूप में मानता है।

आप नोटेशन का उपयोग भी कर सकते हैं:

printf ("Here are the first 8 chars: %*.*s\n",
        8, 8, "A string that is more than 8 chars");

यह "% 8.8s" अंकन के अनुरूप भी है, लेकिन फिर से आप रनटाइम पर न्यूनतम और अधिकतम लंबाई निर्दिष्ट करने की अनुमति देता है - जैसे परिदृश्य में अधिक वास्तविक रूप से:

printf("Data: %*.*s Other info: %d\n", minlen, maxlen, string, info);

POSIX विनिर्देशन printf()इन तंत्रों को परिभाषित करता है।


2
अंतिम उदाहरण के लिए: क्या होगा यदि प्रतिलिपि की गई स्ट्रिंग minlen से छोटी है?
सत्यसेकर

4
आउटपुट -पूर्ण रूप से निर्दिष्ट लंबाई तक बनाने के लिए रिक्त पैडेड होगा (बाईं ओर जब तक आप जोड़ते हैं )।
जोनाथन लेफलर

13
printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");

% 8s न्यूनतम 8 वर्णों की चौड़ाई निर्दिष्ट करेगा। आप 8 पर कम करना चाहते हैं, इसलिए% .8 का उपयोग करें।

यदि आप हमेशा 8 अक्षर प्रिंट करना चाहते हैं तो आप% 8.8 का उपयोग कर सकते हैं


13

वर्णों की एक निश्चित राशि निर्दिष्ट करने के अलावा, आप यह भी उपयोग कर सकते हैं *जिसका अर्थ है कि printf एक तर्क से वर्णों की संख्या लेता है:

#include <stdio.h>

int main(int argc, char *argv[])
{
        const char hello[] = "Hello world";
        printf("message: '%.3s'\n", hello);
        printf("message: '%.*s'\n", 3, hello);
        printf("message: '%.*s'\n", 5, hello);
        return 0;
}

प्रिंटों:

message: 'Hel'
message: 'Hel'
message: 'Hello'

11

printfआप का उपयोग कर सकते हैं

printf("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");

यदि आप C ++ का उपयोग कर रहे हैं, तो आप STL का उपयोग करके समान परिणाम प्राप्त कर सकते हैं:

using namespace std; // for clarity
string s("A string that is more than 8 chars");
cout << "Here are the first 8 chars: ";
copy(s.begin(), s.begin() + 8, ostream_iterator<char>(cout));
cout << endl;

या, कम कुशलता से:

cout << "Here are the first 8 chars: " <<
        string(s.begin(), s.begin() + 8) << endl;

1
नोट: उपयोग नहीं करते ostream_iterator<char>(cout)! इसके बजाय, उपयोग करें ostreambuf_iterator<char>(cout)! प्रदर्शन में अंतर बल्कि बड़ा होना चाहिए।
डिटमार कुल्हल

इसके बजाय उपयोग करने के लिए और अधिक कुशल std::cout.write(s.data(), 8):। या आधुनिक C ++, std::cout << std::string_view{s.data(), 8}
एरियर

4

पहले चार वर्णों को प्रिंट करें:

printf("%.4s\n", "A string that is more than 8 chars");

देखें इस लिंक और अधिक जानकारी (जांच .precision -section) के लिए


4

C ++ में यह आसान है।

std::copy(someStr.c_str(), someStr.c_str()+n, std::ostream_iterator<char>(std::cout, ""));

संपादित करें: यह स्ट्रिंग पुनरावृत्तियों के साथ इसका उपयोग करने के लिए सुरक्षित है, इसलिए आप अंत से भागते नहीं हैं। मुझे यकीन नहीं है कि प्रिंटफ और स्ट्रिंग के साथ क्या होता है जो बहुत कम हैं, लेकिन मुझे लगता है कि यह सुरक्षित हो सकता है।


32
हा, हाँ यह "आसान" है। C ++ हमेशा कार दुर्घटना की तरह दिखता है।
राष्ट्रपति जेम्स के पोल्क

आप अभी भी Printf कर सकते हैं () में c ++ :)
StasM

6
मुझे लगता है कि यह व्यंग्य था। std::cout << someStr.substr(0,8);कहीं अधिक स्पष्ट है।
एमएसलेट्स

2
@MSalters आपको जवाब के रूप में पोस्ट करना चाहिए।
जोनाथन मी


1

C ++ में, मैं इसे इस तरह से करता हूं:

char *buffer = "My house is nice";
string showMsgStr(buffer, buffer + 5);
std::cout << showMsgStr << std::endl;

कृपया ध्यान दें कि यह सुरक्षित नहीं है क्योंकि दूसरा तर्क पारित करते समय मैं स्ट्रिंग के आकार से परे जा सकता हूं और मेमोरी एक्सेस उल्लंघन उत्पन्न कर सकता हूं। इससे बचने के लिए आपको अपनी जांच लागू करनी होगी।

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