मेरे पास अन्य उत्तरों पर टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है, इसलिए मुझे अपना खुद का प्रदान करना होगा।
इस बयान को संबोधित करने के लिए:
"strtok_s एक बफर विंडोज पर strtok के सुरक्षित संस्करण लंघन है खिड़कियों पर मानक strtok सुरक्षित थ्रेड है ...।"
यह सच नहीं है। strtok_s एमएसवीसी कंपाइलर के लिए थ्रेड सुरक्षित संस्करण है। strtok धागा सुरक्षित नहीं है!
इस बयान के समाधान के लिए: "। यह शायद cygwin जो खिड़कियों के रूप में रिपोर्ट लेकिन strtok_r पहले से परिभाषित की तरह POSIX इंटरफेस है पर संकलन करता है, तो टूट जाएगा"
फिर से, सच नहीं है। अंतर यह है कि आप किस कंपाइलर का उपयोग करते हैं। माइक्रोसॉफ्ट के विजुअल सी ++ कंपाइलर का उपयोग करते समय, एमएसवीसी, फंक्शन strtok_s है। जीएनयू कंपाइलर कलेक्शन, जीसीसी जैसे एक और कंपाइलर, एक अलग मानक पुस्तकालय कार्यान्वयन जैसे strtok_r का उपयोग कर सकते हैं। कौन सा फ़ंक्शन उपयोग करने की पहचान करते समय संकलक को लक्षित करें, प्लेटफ़ॉर्म को लक्षित न करें।
मेरी राय में, जोआचिम पिलेबोर्ग का उत्तर इस पृष्ठ पर सबसे अच्छा है।
#if defined(_WIN32) /* || defined(_WIN64) */
#define strtok_r strtok_s
#endif
दोनों _WIN32 और _WIN64 MSVC संकलक द्वारा प्रदान की पूर्व-निर्धारित मैक्रो हैं: हालांकि, यह एक छोटे से संपादित की जरूरत है।एक 64 बिट लक्ष्य संकलित करते समय _WIN64 परिभाषित किया गया है। _WIN32 को 32 और 64 बिट दोनों लक्ष्यों के लिए परिभाषित किया गया है। यह एक समझौता है कि माइक्रोसॉफ्ट ने पीछे की संगतता के लिए बनाया है। Win32 एपीआई निर्दिष्ट करने के लिए _WIN32 बनाया गया था। अब आपको विंडोज एपीआई निर्दिष्ट करने के लिए _WIN32 पर विचार करना चाहिए - यह 32 बिट लक्ष्य के लिए विशिष्ट नहीं है।
['strtok_r()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/strtok_r.html) पॉज़िक्स है; ['strtok_s()'] (http://msdn.microsoft.com/en-us/library/ftsafwz3.aspx) विंडोज है। सादे 'strtok()' का प्रयोग करें जो सभी कार्यान्वयन * (सहायक सी 8 9) * में उपलब्ध है। – pmg
समस्या यह है कि मुझे स्ट्रिंग को स्ट्रिंग करने की आवश्यकता है जबकि स्ट्रिंगोकिंग एक और स्ट्रिंग है, यही कारण है कि मुझे इसे सहेजने के बाद से इसकी आवश्यकता है। – petranaya
@pmg - जब तक आपको थ्रेड या बफर ओवररन सुरक्षा –