Visual Studio 14 CTP1 और बाद में %s
को एक संकीर्ण स्ट्रिंग (char*
) के रूप में हमेशा इलाज नहीं करेगा जब तक आप _CRT_STDIO_LEGACY_WIDE_SPECIFIERS
परिभाषित नहीं करते। इसमें टी लम्बाई संशोधक एक्सटेंशन भी शामिल है जो एमएस को "प्राकृतिक" चौड़ाई कहता है। sprintf
लिए %Ts
char*
है और swprintf
%Ts
के लिए wchar_t*
है।
दृश्य स्टूडियो 13 में और पहले %s
/%c
समारोह/प्रारूप स्ट्रिंग के प्राकृतिक चौड़ाई और %S
/%C
को मैप किया है के साथ प्राकृतिक के विपरीत करने के लिए मैप किया गया है:
printf("%c %C %s %S\n", 'a', L'B', "cd", L"EF");
wprintf(L"%c %C %s %S\n", L'a', 'B', L"cd", "EF");
आप लम्बाई संशोधक का उपयोग कर एक विशिष्ट चौड़ाई को भी बल दे सकता है: %ls
, %lc
, %ws
और %wc
हमेशा मतलब wchar_t
और %hs
और %hc
एक हैं लावे char
। Win9x के दिनों बनाम WinNT में वापस समारोह की प्राकृतिक चौड़ाई के (VS2003 here और VC6 here (%ws
के बारे में सुनिश्चित नहीं हैं के लिए प्रलेखित है और जब यह वास्तव में जोड़ा गया है))
मानचित्रण %s
गया था वास्तव में आसान, का उपयोग करके tchar.h
header आप एक ही स्रोत से संकीर्ण और व्यापक रिलीज बना सकते हैं। _UNICODE
विस्तृत कार्यों के लिए tchar.h
मानचित्र में कार्य परिभाषित किया गया है जब और TCHAR
wchar_t
है, अन्यथा संकीर्ण कार्यों उपयोग किया जाता है और TCHAR
char
है:
_tprintf(_T("%c %s\n"), _T('a'), _T("Bcd"));
एक ऐसी ही विंडोज एसडीके हेडर फाइल और के द्वारा प्रयोग किया सम्मेलन नहीं है वहां मौजूद कुछ प्रारूप फ़ंक्शंस (wsprintf, wvsprintf, wnsprintf और wvnsprintf) लेकिन उन्हें UNICODE
और TEXT
और _UNICODE
और _T
/_TEXT
द्वारा नियंत्रित किया जाता है।
1) विंडोज पर एक संकीर्ण स्ट्रिंग परियोजना, शायद नहीं एक अच्छा विचार के रूप में संकलित:
आप शायद विंडोज पर एक बहु मंच परियोजना का काम बनाने के लिए आप पुराने विंडोज compilers समर्थन करना चाहते हैं, तो 3 विकल्प हैं और आपके मामले में swprintf अभी भी% s का इलाज wchar_t * के रूप में करेगा।
2) कस्टम प्रकार का उपयोग इस तरह के प्रकार के समान परिभाषित करता है।ज प्रारूप तार काम करते हैं:
#ifdef _WIN32
#define PRIs "s"
#define WPRIs L"hs"
#else
#define PRIs "s"
#define WPRIs L"s"
#endif
printf("%" PRIs " World\n", "Hello");
wprintf(L"%" WPRIs L" World\n", "Hello");
3) swprintf के अपने स्वयं के कस्टम संस्करण बना सकते हैं और दृश्य स्टूडियो 13 और पहले साथ उपयोग करें।
मैं वास्तव में यह सुनिश्चित नहीं करता कि इसका उपयोग कैसे करें, मेरे परीक्षणों में _UNICODE परिभाषित किया गया है या परिभाषित नहीं किया गया है व्यवहार एक ही swprintf% s wchar_t की अपेक्षा करता है और char * नहीं। एमएस एक्सटेंशन के लिए क्या आप जानते हैं कि जीसीसी को इस्तेमाल करने का कोई तरीका है या नहीं? – Medran
क्या आप सुनिश्चित हैं कि आपका पर्यावरण आपके लिए इसे परिभाषित नहीं कर रहा है (वीएस में प्रोजेक्ट सेटिंग्स में)? यदि जीसीसी द्वारा आपका मतलब है मिनजीडब्ल्यू तो हाँ, मिनजीडब्ल्यू एमएस सी रन टाइम का उपयोग कर सकता है, http://stackoverflow.com/questions/6729013/mingw-printf-size- स्पेसिफिकेशन-character-h – Anders
मैक पर कोई gcc देखें ... प्रोजेक्ट सेटिंग्स में आप चरित्र प्रकार को 'परिभाषित नहीं' या 'यूनिकोड का उपयोग करें' या 'मल्टीबाइट का उपयोग करें' के रूप में निर्दिष्ट करते हैं। यदि आप 'परिभाषित नहीं' कहते हैं तो _UNICODE परिभाषित नहीं किया गया है, यदि आप कहते हैं 'यूनिकोड का उपयोग करें' तो _UNICODE परिभाषित किया गया है। – Medran