2010-02-24 8 views
10

मैं कार की अपनी सरणी को दो तरीकों से सॉर्ट कर रहा हूं। सालाना एक जो नीचे दिखाया गया है। और एक और बनाकर। मेक एक char * मैं स्ट्रिंग्स की तुलना कैसे करूं जब मेरे पास सिर्फ पॉइंटर्स हों?सी या सी ++। Char * पॉइंटर्स दिए गए दो तारों की तुलना कैसे करें?

int i, j; 
for(i=0; i<100; i++){ 
    for(j=0; j<100-i; j++){ 
     if(carArray[i]!=NULL && carArray[j]!= NULL && carArray[j+1]!=NULL){ 
      if(carArray[i]->year > carArray[j+1]->year){ 
       swap(carArray[j], carArray[j+1]); 
      } 
     } 
    } 
} 

उपरोक्त विधि int (वर्ष) के लिए काम करती है। मैं इसे चार पॉइंटर्स के लिए कैसे काम कर सकता हूं?

+1

तुलना करने के लिए एक असंबंधित नोट पर: क्या आपको पता है कि बुलबुला तरह, सुपर duper अक्षम है ना? – rlbond

+3

बहुत बड़े इनपुट पर यह सुपर-डुप्कर अक्षम है। छोटे इनपुट आकारों पर यह वास्तव में कार्यान्वित करने के लिए इतना आसान होने के कारण, अधिक सेक्सी प्रकार की तुलना में तेज़ हो सकता है। बेशक छोटे इनपुट (इस तरह की) पर गति वास्तव में चिंता का विषय नहीं है। –

+2

लेकिन यदि आप छोटे इनपुट को सॉर्ट करना चाहते हैं, तो आप सम्मिलन सॉर्ट का भी उपयोग कर सकते हैं, जिसमें बेहतर औसत प्रदर्शन होता है, भले ही यह ओ (एन^2) – bobDevil

उत्तर

27

बहुत अधिक में, strcmp पर कॉल करना है। यदि आपके तार (कुछ अजीब कारणों के लिए) एनयूएल समाप्त नहीं हैं, तो आपको इसके बजाय strncmp का उपयोग करना चाहिए।

हालांकि, सी ++ में आपको वास्तव में चार सरणी में स्ट्रिंग्स में हेरफेर नहीं करना चाहिए यदि आप उचित रूप से इससे बच सकते हैं। इसके बजाय std::string का उपयोग करें।

+2

भी हो, क्योंकि आप सॉर्ट कर रहे हैं, std :: sort your दोस्त भी http://www.cplusplus.com/reference/algorithm/sort/ आपको आपूर्ति करने की आवश्यकता है std :: सॉर्ट का उपयोग करने के लिए एक तुलनात्मक कार्य है। – Carl

13

मुझे लगता है कि आपको strcmp() फ़ंक्शन का उपयोग करने की आवश्यकता है।

2

सुनिश्चित करें कि char * शून्य नहीं है, और यदि आप चाहते हैं, तो असंवेदनशील तुलना के मामले में stricmp() फ़ंक्शन देखें। अन्यथा, strcmp() का उपयोग करें।

char * वास्तव में प्रत्येक स्ट्रिंग में पहले वर्ण के स्मृति पते का प्रतिनिधित्व करता है। तो आप वास्तव में पॉइंटर्स के मानों की तुलना नहीं करना चाहते हैं, लेकिन वे जो सामग्री इंगित करते हैं।

+1

stricmp() मानक नहीं है: http://stackoverflow.com/questions/1784767/g-error-stricmp-was-not-declared-in-this-scope-but-ok-for-strcmp मुझे लगता है कि यह माइक्रोसॉफ्ट है विशिष्ट। –

+0

यदि आपकी लाइब्रेरी में stricmp() नहीं है, तो strcmpi() की जांच करें और यदि यह strcasecmp() नहीं है। उस कार्यक्षमता के साथ कुछ होगा। –

1

सी में इसके strcmp() फ़ंक्शन में पहले से ही बताया गया है। सी ++ में आप तुलना() फ़ंक्शन का उपयोग कर सकते हैं।

सी:

char str1[10] = "one"; 
char str2[10] = "two"; 

if (strcmp(s, t) != 0) // if they are equal compare return 0 

सी ++

string str1 ("one"); 
string str2 ("two"); 
if (str1.compare(str2) != 0) // if they are equal compare return 0 
+0

उहह, नहीं, आपको यहां 'तुलना' का उपयोग नहीं करना चाहिए। तारों पर '==' ऑपरेटर यही है। तुलना करने का एकमात्र कारण यह है कि जब आप परवाह करते हैं कि एक स्ट्रिंग (वर्णानुक्रम) दूसरे से कम या उससे अधिक है या नहीं। –

+0

@ टी.ई.डी. 'तुलना' फ़ंक्शन वर्णमाला तुलना की बजाय संख्यात्मक (वर्ण मान) करता है। अर्थात। तारों की एक शब्दावली तुलना। – davmac

0

मैं बेशक यहां यह सोचते हैं आप चार है कार के लिए * का हूँ बनाता है

int i, j; 
for(i=0; i<100; i++){ 
    for(j=0; j<100-i; j++){ 
     if(carArray[i]!=NULL && carArray[j]!= NULL && carArray[j+1]!=NULL){ 
      if(strcmp(carArray[i]->make, carArray[j+1]->make) == 0) 
      { 
       //Do whatever here 
      } 
     } 
    } 
} 

आप 0 के खिलाफ तुलना करना चाहते हैं क्योंकि यदि स्ट्रिंग दो स्ट्रिंग्स के बीच कोई अंतर नहीं है तो 0 वापस आ जाएगा।
strcmp दो const char char * लेता है।
http://www.cplusplus.com/reference/clibrary/cstring/strcmp/

0

आप वास्तव में के बजाय इस तरह एक बुलबुला प्रकार (सी ++, #include <algorithm> में) या std::sort (सी, #include <stdlib.h> में) qsort उपयोग करना चाहिए। यदि यह सी ++ है और आप कच्चे सी तारों के बजाय std::string का उपयोग करने के लिए @ टी.ई.डी. की सलाह लेते हैं, तो आपको तुलना भी निर्दिष्ट नहीं करना पड़ता है क्योंकि < ऑपरेटर का उपयोग किया जाएगा और सही काम करेगा।

0

जब आप विशेष रूप से दो चार संकेत तुलना करने की आवश्यकता है, तो आप हमेशा की तरह उनकी तुलना कर सकते हैं: तुलना ऑपरेटरों <, >, का उपयोग करके == आदि

चौथाई मामले में मुद्दा है कि आप डॉन टी दो चार पॉइंटर्स की तुलना करने की आवश्यकता है। हालांकि आपको क्या चाहिए, दो सी-स्टाइल स्ट्रिंग्स तुलना करने के लिए इन चार पॉइंटर्स इंगित कर रहे हैं। सी-शैली तारों की तुलना करने के लिए, आपको मानक strcmp फ़ंक्शन का उपयोग करना होगा।

के शीर्ष पर, आपके सॉर्टिंग एल्गोरिदम में शून्य तत्वों को संभालने का दृष्टिकोण किसी भी तरह का अर्थ नहीं लग रहा है। एक इनपुट सरणी की कल्पना करें जिसमें वैकल्पिक नल पॉइंटर्स और गैर-नल पॉइंटर्स शामिल हैं। यह स्पष्ट है कि आपके सॉर्टिंग एल्गोरिदम कभी भी कुछ भी सॉर्ट नहीं करेगा, क्योंकि आपके if की स्थिति कभी भी सत्य नहीं होगी। आपको शून्य तत्वों के अपने हैंडलिंग पर पुनर्विचार करने की आवश्यकता है। बेशक, सबसे पहले, आपको यह तय करना होगा कि उनके साथ क्या करना है। अनदेखा करें और जगह पर छोड़ दें? सरणी के एक छोर तक पुश करें? Somethng और?

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