2008-08-14 8 views
23

में लोअर/अपर स्ट्रिंग टू स्ट्रिंग लोगों को सी ++ में लोअर केस/अपर केस के लिए स्ट्रिंग करने का सबसे अच्छा तरीका क्या है?सी ++

समस्या इस तथ्य से जटिल है कि सी ++ अंग्रेजी केवल प्रोग्रामिंग भाषा नहीं है। क्या कोई अच्छी बहुभाषी विधि है?

+3

ध्यान रखें कि वर्तमान समाधान यूनिकोड संगत नहीं है। – sorin

उत्तर

26
#include <algorithm> 
std::string data = "Abc"; 
std::transform(data.begin(), data.end(), data.begin(), ::toupper); 

http://notfaq.wordpress.com/2007/08/04/cc-convert-string-to-upperlower-case/

इसके अलावा, आम स्ट्रिंग तरीकों के लिए CodeProject लेख: http://www.codeproject.com/KB/stl/STL_string_util.aspx

+1

आपको यह कहना चाहिए कि – c0m4

+7

का उपयोग करने के लिए आपको शामिल करने की आवश्यकता है, मुझे लगता है कि "स्मार्ट कोट्स" की बजाय स्ट्रिंग शाब्दिक के उदाहरण में "गूंगा उद्धरण" का उपयोग करना बेहतर है। यह कॉपी-पेस्ट-संकलन के मामले में बेहतर बनाता है। –

+3

यह गैर-ASCII तारों के लिए कैसे काम करेगा? – Nikolai

4

तुम भी this question समीक्षा करनी चाहिए। असल में समस्या यह है कि यूनिकोड डेटा को संभालने के लिए मानक सी/सी ++ पुस्तकालयों का निर्माण नहीं किया गया था, इसलिए आपको अन्य पुस्तकालयों को देखना होगा।

यह C++ मानक अद्यतन होने के कारण बदल सकता है। मुझे पता है कि बोर्लैंड (कोडगियर) के अगले कंपाइलर में यूनिकोड समर्थन होगा, और मुझे लगता है कि माइक्रोसॉफ्ट के सी ++ कंपाइलर के पास पहले से ही स्ट्रिंग लाइब्रेरीज़ हैं जो यूनिकोड का समर्थन करती हैं।

2

जैसा कि डैरेन ने आपको बताया था, सबसे आसान तरीका std :: transform का उपयोग करना है।

लेकिन सावधान रहें कि कुछ भाषा में, उदाहरण के लिए जर्मन की तरह, निचले और अपरकेस के बीच हमेशा एक मैपिंग नहीं होती है। "निबंध" लोअरकेस चरित्र (ग्रीक चरित्र बीटा की तरह दिखता है) को अपरकेस में "एसएस" में बदल दिया गया है।

20
> std::string data = “Abc”; 
> std::transform(data.begin(), data.end(), data.begin(), ::toupper); 

यह काम करेगा, लेकिन यह मानक "सी" लोकेल का उपयोग करेगा। यदि आप किसी अन्य लोकेल के लिए टोलर प्राप्त करने की आवश्यकता है तो आप पहलुओं का उपयोग कर सकते हैं। पहलुओं का उपयोग करके उपरोक्त कोड होगा:

locale loc(""); 
const ctype<char>& ct = use_facet<ctype<char> >(loc); 
transform(str.begin(), str.end(), std::bind1st(std::mem_fun(&ctype<char>::tolower), &ct)); 
+1

अच्छा सूचक धन्यवाद! – viksit

0

क्या स्टीव कहते हैं सही है, लेकिन मुझे लगता है कि यदि आपके कोड कई भाषाओं का समर्थन करने के लिए किया था, आपको फ़ैक्टरी विधि है कि तरीकों कि प्रासंगिक कर का एक सेट समाहित हो सकता है उस भाषा के आधार पर ToUpper या Toower।

6

, निक मजबूत के जवाब का उपयोग करें "use_factet" में वर्तनी त्रुटि नोट करने के लिए उम्मीद कर कॉपी-pasters के लिए और लापता तीसरे पैरामीटर एसटीडी :: परिणत:

locale loc(""); 
const ctype<char>& ct = use_factet<ctype<char> >(loc); 
transform(str.begin(), str.end(), std::bind1st(std::mem_fun(&ctype<char>::tolower), &ct)); 

होना चाहिए

locale loc(""); 
const ctype<char>& ct = use_facet<ctype<char> >(loc); 
transform(str.begin(), str.end(), str.begin(), std::bind1st(std::mem_fun(&ctype<char>::tolower), &ct)); 
+0

धन्यवाद हेक्सेटिक, ऐसा लगता है कि जीएमएन ने इसे हमारे लिए साफ कर दिया :) –

1

मैं एक तरह से यूनिकोड (और बहुभाषी) वर्ण के मामले कन्वर्ट करने के लिए मिल गया है, लेकिन आप को पता है/(किसी भी तरह) को खोजने के चरित्र के स्थान की जरूरत है:

#include <locale.h> 

_locale_t locale = _create_locale(LC_CTYPE, "Greek"); 
AfxMessageBox((CString)""+(TCHAR)_totupper_l(_T('α'), locale)); 
_free_locale(locale); 

मैं एक नहीं मिला है अभी तक ऐसा करने का तरीका ... मैं जानता हूं कि कैसे, मुझे बताएं। शून्य करने के लिए

सेटिंग में ऐसे स्थान से काम नहीं करता ...

1

VCL एक SysUtils.hpp जो LowerCase(unicodeStringVar) और UpperCase(unicodeStringVar) जो आप के लिए काम कर सकते हैं है है। मैं इसे सी ++ बिल्डर 200 में उपयोग करता हूं।