2009-12-06 15 views
9

मेरे पास आधार wchar_t* है और मैं अंत में एक और जोड़ना चाहता हूं। मैं यह कैसे करुं? मैं बहिष्कृत कार्यों का उपयोग नहीं कर सकता क्योंकि मैं चेतावनियों को त्रुटियों के रूप में देख रहा हूं।आप दो wchar_t * को एक साथ कैसे जोड़ते हैं?

+0

आप "पदावनत" के साथ मतलब है, तो मानक कार्यों कि माइक्रोसॉफ्ट पसंद नहीं करता है, तो परेशान न करें:

यहाँ एक wstrlcat कार्य करने के लिए स्रोत है। क्या आप वास्तव में विक्रेता लॉक-इन चाहते हैं, लेकिन फिर भी कोई पूर्ण सुरक्षा नहीं है? प्रोजेक्ट फ़ाइल में बस '_CRT_SECURE_NO_WARNINGS' को परिभाषित करें, और वीसी ++ बंद हो जाएंगे। – MSalters

उत्तर

6
#include <wchar.h> 

wchar_t *wcsncat(wchar_t *ws1, const wchar_t *ws2, size_t n); 

wcsncat() समारोह कोई श्रृंखला का पहला n वर्णों से अधिक स्ट्रिंग के अंत करने के लिए ws2 द्वारा की ओर इशारा किया ws1 द्वारा की ओर इशारा किया जोड़ता है। NULL चरित्र ws2 में n वर्णों से पहले दिखाई देता है, NULL वर्ण तक के सभी वर्ण ws1 पर जोड़े गए हैं। ws2 का पहला अक्षर ws1 के वर्ण को समाप्त करने को ओवरराइट करता है। एक NULL समापन चरित्र हमेशा परिणाम में संलग्न होता है, और यदि ऑब्जेक्ट ओवरलैप की प्रतिलिपि बनाने के लिए उपयोग की जाने वाली वस्तुएं, व्यवहार अपरिभाषित है।

ws1

अशक्त-समाप्त गंतव्य स्ट्रिंग है।

ws2

अशक्त-समाप्त स्रोत स्ट्रिंग है।

n

संलग्न करने के लिए वर्णों की संख्या है।

+2

इसे अस्वीकार कर दिया गया है। – Chad

5

ऐसा करने का सबसे पोर्टेबल तरीका ऊपर वर्णित wcsncat है, लेकिन ऐसा लगता है कि आप दृश्य सी ++ 2005 और बाद में "सुरक्षित सीआरटी" सुविधाओं के लिए प्रतिबद्ध हैं। (केवल माइक्रोसॉफ्ट ने उन कार्यों को "बहिष्कृत" किया है।) यदि ऐसा है, तो स्ट्रिंग.h में घोषित wcsncat_s का उपयोग करें।

12

क्यों पहली जगह में एक std::wstring का उपयोग नहीं:

wchar_t *ws1 = foo(), *ws2 = bar(); 
std::wstring s(ws1); 
s += std::wstring(ws2); 
std::wcout << s << std::endl; 

यदि आवश्यक हो, std::wstring::c_str() आप एक const wchar_t* के रूप में परिणाम के लिए पहुँच देता है।

+1

या 'const wchar_t * concatenation = s.c_str();' निर्भर करता है - लेकिन हाँ, पहली चीज जो मैं करता हूं वह उन्हें एक स्ट्रिंग प्रकार में लपेटती है। –

+1

+1, लोगों को एसटीएल का उपयोग करना चाहिए जहां उचित हो। – DaMacc

1

wstrncat/wcsncat कार्यों का उपयोग करना अच्छा है, लेकिन मुझे लगता है कि इन सुरक्षित स्ट्रिंग कार्यों का सबसे अच्छा संस्करण ओपन बीएसडी, अर्थात strlcat और wstrlcat द्वारा बनाई गई 'l' होते हैं। 'N' संस्करणों के साथ, आप एक स्ट्रिंग के साथ समाप्त हो सकते हैं जिसमें शून्य टर्मिनेटर नहीं है, इसलिए आपके पास अभी भी सुरक्षा समस्याएं हो सकती हैं। इसके अलावा कुछ कार्यान्वयन बफर में अप्रयुक्त स्थान को शून्य कर देंगे जो चीजों को थोड़ा धीमा कर सकता है।

विकिपीडिया पृष्ठ में इन कार्यों पर कुछ और जानकारी है: Strlcpy et al.। एकमात्र समस्या यह है कि ये मानक पुस्तकालयों में नहीं हैं, इसलिए आपको अपने प्रोजेक्ट में कोड शामिल करना होगा।

 
/* 
* Appends src to string dst of size siz (unlike strncat, siz is the 
* full size of dst, not space left). At most siz-1 characters 
* will be copied. Always NUL terminates (unless siz = siz, truncation occurred. 
*/ 
size_t wstrlcat(wchar_t *dst, const wchar_t *src, size_t siz) 
{ 
     wchar_t *d = dst; 
     const wchar_t *s = src; 
     size_t n = siz; 
     size_t dlen; 

     /* Find the end of dst and adjust bytes left but don't go past end */ 
     while(n-- != 0 && *d != L'\0') { 
       d++; 
     } 

     dlen = d - dst; 
     n = siz - dlen; 

     if (n == 0) { 
       return(dlen + wcslen(s)); 
     } 

     while(*s != L'\0') 
     { 
       if(n != 1) 
       { 
         *d++ = *s; 
         n--; 
       } 
       s++; 
     } 

     *d = '\0'; 
     return(dlen + (s - src));  /* count does not include NUL */ 
} 
संबंधित मुद्दे