आपका कोड ठीक है।
समस्या यह है कि यदि आप एक स्ट्रिंग पास करते हैं जो उपयोगकर्ता को printf प्रारूप स्ट्रिंग के रूप में नियंत्रित किया जाता है, तो सुरक्षा कीड़े उत्पन्न हो सकती हैं।
उदाहरण के लिए, printf(userName);
कहाँ userName उपयोगकर्ता द्वारा आपूर्ति की जाती है, यदि कोई उपयोगकर्ता "% s" पारित कर सकते हैं, और ढेर पर एक यादृच्छिक पते पर डेटा तक पहुँचने शुरू करने के लिए अपने कार्य मिलता है, जो एक में परिणाम सकता है दुर्घटना। printf स्टैक से अतिरिक्त पैरामीटर पॉप करने का प्रयास करेगा, जिसके परिणामस्वरूप एक ढेर भ्रष्टाचार होगा। इस तरह के सेवा हमले से इनकार करना शायद सबसे अच्छा मामला है, स्टैक पर मूल्यों को डंप करने के लिए प्रिंटफ प्राप्त करके सूचना का खुलासा किया जा सकता है और स्टैक पर रिटर्न पते को संशोधित करने के लिए प्रिंटफ स्टाइल फ़ंक्शंस प्राप्त करने के तरीके भी हैं।
चूंकि आपके तार उपयोगकर्ता नियंत्रित नहीं हैं, इसलिए इस संदेश को अनदेखा करना सुरक्षित है। सामान्य फिक्स printf("%s", userName);
के साथ दिए गए प्रिंटफ उदाहरण को प्रतिस्थापित करना है, जो आपके मामले में मदद नहीं करेगा क्योंकि कॉन्स स्ट्रिंग में प्रारूप स्ट्रिंग्स दिखाई देती हैं।
विकिपीडिया में प्रारूप स्ट्रिंग भेद्यता पर अधिक है: http://en.wikipedia.org/wiki/Format_string_vulnerabilities