यह संकलित है क्योंकि printf
यह सुरक्षित नहीं है, क्योंकि यह C अर्थ 1 में परिवर्तनशील तर्कों का उपयोग करता है । केवल सी-स्टाइल स्ट्रिंग के printf
लिए कोई विकल्प नहीं है std::string
। इसकी अपेक्षा में कुछ और का उपयोग करना निश्चित रूप से आपको इच्छित परिणाम नहीं देगा। यह वास्तव में अपरिभाषित व्यवहार है, इसलिए कुछ भी हो सकता है।
इसे ठीक करने का सबसे आसान तरीका, जब से आप C ++ का उपयोग कर रहे हैं, इसे सामान्य रूप से प्रिंट कर std::cout
रहा std::string
है , क्योंकि ऑपरेटर ओवरलोडिंग के माध्यम से इसका समर्थन करता है:
std::cout << "Follow this command: " << myString;
यदि, किसी कारण से, आपको सी-स्टाइल स्ट्रिंग निकालने की आवश्यकता है, तो आप इसे शून्य-समाप्त करने की c_str()
विधि का उपयोग कर सकते हैं । अपने उदाहरण का उपयोग करना:std::string
const char *
#include <iostream>
#include <string>
#include <stdio.h>
int main()
{
using namespace std;
string myString = "Press ENTER to quit program!";
cout << "Come up and C++ me some time." << endl;
printf("Follow this command: %s", myString.c_str()); //note the use of c_str
cin.get();
return 0;
}
यदि आप एक ऐसा फंक्शन चाहते हैं printf
, जो सुरक्षित हो, लेकिन सुरक्षित हो, तो वैरेडिक टेम्प्लेट (C ++ 11, MSVC12 के रूप में सभी प्रमुख कंपाइलरों पर समर्थित) देखें। आप यहां एक उदाहरण पा सकते हैं । ऐसा कुछ भी नहीं है जिसे मैं मानक पुस्तकालय में लागू करने के बारे में जानता हूं, लेकिन विशेष रूप से बूस्ट में हो सकता है boost::format
।
[१]: इसका मतलब यह है कि आप किसी भी तर्क को पारित कर सकते हैं, लेकिन फ़ंक्शन आपको उन तर्कों की संख्या और प्रकार बताने के लिए निर्भर करता है। के मामले में printf
, जिसका अर्थ है एन्कोडेड प्रकार की जानकारी के साथ एक स्ट्रिंग %d
जिसका अर्थ है int
। यदि आप प्रकार या संख्या के बारे में झूठ बोलते हैं, तो फ़ंक्शन के पास जानने का कोई मानक तरीका नहीं है, हालांकि कुछ कंपाइलरों में झूठ बोलने पर चेकों की जांच करने और चेतावनी देने की क्षमता होती है।