2010-08-30 13 views
5

में स्ट्रिंग की तुलना करना, मैं फ़ाइल में टिप्पणियों की जांच के लिए स्ट्रिंग के पहले तत्व के साथ एक अक्षर अक्षर की तुलना करना चाहता हूं। एक char का उपयोग क्यों करें? मैं इसे एक समारोह में बनाना चाहता हूं, जो टिप्पणी के लिए एक चरित्र var स्वीकार करता है। मैं एक स्ट्रिंग की अनुमति नहीं देना चाहता क्योंकि मैं इसे लंबाई में एक वर्ण में सीमित करना चाहता हूं।कैरेक्टर लिटल से स्ट्रड :: सी ++

इस बात को ध्यान में रखते हुए मुझे लगता है कि जाने का आसान तरीका चरित्र को संबोधित करना होगा और इसे std :: स्ट्रिंग की तुलना फ़ंक्शन में पास करना होगा। हालांकि यह मुझे अनपेक्षित परिणाम दे रहा है।

मेरे कोड इस प्रकार है:

#include <string> 
#include <iostream> 

int main (int argc, char *argv[]) 
{ 
    std::string my_string = "bob"; 
    char my_char1 = 'a'; 
    char my_char2 = 'b'; 

    std::cout << "STRING : " << my_string.substr(0,1) << std::endl 
     << "CHAR : " << my_char1 << std::endl; 
    if (my_string.substr(0,1).compare(&my_char1)==0) 
    std::cout << "WOW!" << std::endl; 
    else 
    std::cout << "NOPE..." << std::endl; 

    std::cout << "STRING : " << my_string.substr(0,1) << std::endl 
     << "CHAR : " << my_char2 << std::endl; 
    if (my_string.substr(0,1).compare(&my_char2)==0) 
    std::cout << "WOW!" << std::endl; 
    else 
    std::cout << "NOPE..." << std::endl; 

    std::cout << "STRING : " << my_string << std::endl 
     << "STRING 2 : " << "bob" << std::endl; 
    if (my_string.compare("bob")==0) 
    std::cout << "WOW!" << std::endl; 
    else 
    std::cout << "NOPE..." << std::endl; 
} 

मुझे देता है ...

STRING : b 
CHAR : a 
NOPE... 
STRING : b 
CHAR : b 
NOPE... 
STRING : bob 
STRING 2 : bob 
WOW! 

समारोह ऐसा क्यों लगता है सब-स्ट्रिंग और चरित्र ही नहीं हैं। वर्णों और std :: स्ट्रिंग वर्र्स की उचित तुलना करने का सबसे छोटा तरीका क्या है?

(मेरे सवाल का से बचने के पुनर्वर्गीकरण .... बेझिझक छोड़ के लिए एक छोटी शेख़ी)
जब मैं कम से कम मेरा मतलब है का कहना है कि वाग्मिता कोडिंग के लिए की इच्छा के चलते। कृपया ध्यान दें, यह होमवर्क प्रश्न नहीं है। मैं एक रासायनिक इंजीनियरिंग पीएचडी उम्मीदवार हूं और स्वतंत्र शोध के हिस्से के रूप में कोडिंग कर रहा हूं। मेरे पिछले प्रश्नों में से एक को उपयोगकर्ता msw (जिसे एक स्नैप टिप्पणी भी मिली) द्वारा "होमवर्क" के रूप में पुनः वर्गीकृत किया गया था, जब मैंने दक्षता के बारे में पूछा, जिसे मैंने दुर्व्यवहार की सीमा पर विचार किया था। मेरा कोड दूसरों द्वारा पुन: उपयोग किया जा सकता है या नहीं, लेकिन मैं इसे पढ़ने और रखरखाव करने में आसान बनाने की कोशिश कर रहा हूं। जहां भी संभव हो सके मेरे कोड को यथासंभव कुशल बनाने की एक विचित्र इच्छा है। इसलिए दक्षता और वाक्प्रचार पर सवाल।

उत्तर

14

से तुलना करने में उपयोग कर सकते हैं ऐसा करने से:

if (my_string.substr(0,1).compare(&my_char2)==0) 
क्योंकि आप "धोखा देना" कर रहे हैं

काम नहीं करेंगे स्ट्रिंग यह सोचने में कि यह एक शून्य-समाप्त सी-स्ट्रिंग के लिए एक सूचक प्राप्त कर रहा है। इस पर आपके प्रोग्राम को दुर्घटनाग्रस्त करने और इसमें अजीब प्रभाव होंगे। इसके बजाय, बस my_char साथ श्रृंखला का पहला चरित्र तुलना करने के लिए सामान्य समानता का उपयोग करें:

if (my_string[0] == my_char) 
    // do stuff 
+5

और भूल जाते हैं यह देखना होगा कि '0

3

आप ऑपरेटर [] स्ट्रिंग की एक एकल चार

// string::operator[] 
#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
    string str ("Test string"); 
    int i; char c = 't'; 
    for (i=0; i < str.length(); i++) 
    { 
     if (c == str[i]) { 
      std::cout << "Equal at position i = " << i << std::endl; 
     } 
    } 
    return 0; 
} 
1

पहले दो तुलना करने के लिए कॉल के व्यवहार पूरी तरह से क्या यादृच्छिक स्मृति सामग्री प्रत्येक चार में से पता इस प्रकार पर निर्भर है। आप basic_string::compare(const char*) पर कॉल कर रहे हैं और यहां पर परम एक सी-स्ट्रिंग (शून्य-समाप्ति) माना जाता है, न कि एक एकल। तुलना() कॉल आपके वांछित चार की तुलना करेगा, उसके बाद उस अक्षर के बाद मेमोरी में सबकुछ अगले 0x00 बाइट तक होगा, जिसमें std :: स्ट्रिंग है।

0to< ऑपरेटर के पास इनपुट इनपुट के लिए उचित अधिभार होता है ताकि आपका आउटपुट उस चीज़ को प्रतिबिंबित न करे जो आप वास्तव में यहां तुलना कर रहे हैं।

const char[] a = "a"; की घोषणाओं और बी को कनवर्ट करें और आप जो भी करना चाहते हैं उसे प्राप्त करेंगे।

4

क्यों नहीं सिर्फ अपने स्ट्रिंग पर अनुक्रमण ऑपरेटर का उपयोग करें? यह एक चार प्रकार वापस आ जाएगी।

if (my_string[0] == my_char1) 
1

सुंदर मानक, सी ++ में तारों को निरस्त कर दिया गया है; पात्र नहीं हैं।तो मानक का उपयोग करके विधि क्या तुम सच में जाँच कर रहे हैं, तो "ख \ 0" == 'बी' की तुलना करें।

मैं इस का इस्तेमाल किया और वांछित आउटपुट मिल गया:

if (my_string.substr(0,1).compare(0, 1, &my_char2, 1)==0) 
    std::cout << "WOW!" << std::endl; 
else 
    std::cout << "NOPE..." << std::endl; 

क्या यह कह रहा है-स्ट्रिंग की स्थिति 0 पर शुरू, 1 की लंबाई का उपयोग करें, और की लंबाई के साथ मेरे चरित्र संदर्भ की तुलना है 1. Reference

+1

स्ट्रिंग्स ++ अशक्त-समाप्त नहीं कर रहे हैं। क्योंकि वे वास्तव में चार के लिए सूचक हैं वे अशक्त-समाप्त सी में कर रहे हैं। –

+0

@Draco: 'std :: स्ट्रिंग' (हालांकि कि 0x से बदल रहा है) अशक्त-समाप्त होने की आवश्यकता नहीं है, लेकिन वहां अभी भी सी ++ मानक में स्थानों के बहुत सारे है कि चार में से अशक्त-समाप्त सरणी मान लिया गया है। , 'Std :: स्ट्रिंग' भीतर की अनेक विधियों का भी शामिल है के रूप में इस सवाल को दिखाता है। –

संबंधित मुद्दे