मेरे पास एक स्ट्रिंग name2 है। मैं इसमें बड़े अक्षरों को हटाना चाहता हूं और इसके बजाय लोअरकेस रखना चाहता हूं।

इनपुट:Car आउटपुट:car

यहाँ मेरा लूप कोड है: -

 if(isupper(name2.at(i))) {
           string tem=to_string(tolower(name2.at(i)));
            name2.erase(i,1);
            name2.insert(i,tem);
        }

i सिर्फ लूप वेरिएबल है।

हालाँकि, यहाँ मेरा इनपुट बनाम आउटपुट है

इनपुट:Sushant आउटपुट:115ushant

यह किसी प्रकार का ASCII समकक्ष आउटपुट दे रहा है, मुझे लगता है। मैं यह कैसे तय करुं?

0
GameX 8 अक्टूबर 2019, 14:02
 – 
TheCoder
8 अक्टूबर 2019, 14:05
1
std::string को लोअर केस में कैसे बदलें? का संभावित डुप्लिकेट
 – 
Alexander
8 अक्टूबर 2019, 14:08
आपको मिटाने/सम्मिलित करने की आवश्यकता नहीं है, आप सीधे मान सेट कर सकते हैं: name2[i] = tolower(name[i])। मुझे लगता है कि आप स्ट्रिंग पर पुनरावृति कर रहे हैं, क्या आप (for(size_t i = 0; i < name2.length; ++i)) हैं? तब आपको रेंज चेकिंग एक्सेस (at(i)) की आवश्यकता नहीं होगी, आप जानते हैं आप रेंज में हैं, इसलिए अधिक कुशल नॉन-चेकिंग इंडेक्स ऑपरेटर (name2[i]) को प्राथमिकता दें।
 – 
Aconcagua
8 अक्टूबर 2019, 14:11

2 जवाब

सबसे बढ़िया उत्तर

यहाँ, to_string, tolower के परिणाम को एक पूर्णांक के रूप में व्याख्यायित करता है। तो जो आप अपनी स्ट्रिंग में डाला हुआ देखते हैं वह 's' (115) का ASCII मान है। इसे ठीक करने के लिए, स्ट्रिंग में कनवर्ट करने की कोई आवश्यकता नहीं है, बस सीधे वर्णों का उपयोग करें:

char c = tolower(name.at(i));
name2.erase(i, 1);
name2.insert(i, c);

सीधे tolower() वर्ण को iवें स्थान पर रखना आसान और अधिक कुशल होगा:

name[i] = std::tolower(name[i]);

कहा जा रहा है, एक बार में पूरी स्ट्रिंग को कम करना आसान होगा, और यह मान लें कि कुछ पात्रों को अनावश्यक रूप से कम किया जाएगा:

std::transform(name.begin(), name.end(), name.begin(), 
                [](unsigned char c){ return std::tolower(c); }
              );

यह भी देखें: std::tolower

0
Ton van den Heuvel 8 अक्टूबर 2019, 15:06
यहाँ मेरा कोड है (int i=0;i<len;++i){ name[i] =tolower(name[i]); } इनपुट और आउटपुट अभी भी वही हैं। मैं अब क्या गलत कर रहा हूँ?
 – 
GameX
8 अक्टूबर 2019, 14:31
क्या आप सुनिश्चित हैं कि len सही है? क्या होगा यदि आप इसे name.size() से बदल दें?
 – 
Ton van den Heuvel
8 अक्टूबर 2019, 14:33
अभी भी वही, लेन मूल रूप से name2.length() था
 – 
GameX
8 अक्टूबर 2019, 14:34
सभी कोड देखे बिना यह कहना मुश्किल है कि समस्या क्या है।
 – 
Ton van den Heuvel
8 अक्टूबर 2019, 14:35
नीस, भी, लूप के लिए एक श्रेणी-आधारित है: for(auto& c : name) { c = tolower(static_cast<unsigned char>(c)); }
 – 
Aconcagua
8 अक्टूबर 2019, 14:44

यह केवल लूप के लिए रेंज-आधारित का उपयोग करके किया जा सकता है।

यहाँ एक प्रदर्शनकारी कार्यक्रम है।

#include <iostream>
#include <string>
#include <cstring>

int main()
{
    std::string s;

    std::cout << "Enter a word: ";
    std::cin >> s;

    for ( char &c : s )
    {
        if ( std::isupper( ( unsigned char )c ) )
        {
            c = tolower( c );
        }
    }

    std::cout << s << '\n';
}

इसका आउटपुट ऐसा दिख सकता है

Enter a word: Sushant
sushant

जहां तक ​​आपके इफ स्टेटमेंट की बात है तो कम से कम यह सब-स्टेटमेंट

string tem=to_string(tolower(name2.at(i)));

बात नहीं बनी। उदाहरण के लिए

std::cout << std::to_string( 'A' ) << '\n';

आउटपुट कर सकते हैं

65

जो 'ए' वर्ण के ASCII मान से मेल खाती है।

वह फ़ंक्शन है std::to_string वर्ण 'ए' के ​​प्रचारित कोड को एक स्ट्रिंग के पूर्णांक के रूप में परिवर्तित करता है।

0
Vlad from Moscow 8 अक्टूबर 2019, 14:23