2010-05-28 16 views
9
#include <stdlib.h> 
#include <stdio.h> 
#include <iostream> 
#include <string.h> 
using namespace std; 
int main() 
{ 
     string cmd; 
     while(strcmp(cmd.c_str(),"exit")==0 && strcmp(cmd.c_str(),"\exit")==0) 
     { 
       cin>>cmd; 
       cout<<cmd; 
     } 
     return 0; 
} 

मैं अटक गया हूं।स्ट्रिंग के साथ स्ट्रिंग की तुलना कैसे करें *?

+1

यह –

+0

@Brian प्रश्न में सीधे कोड पेस्ट करना बेहतर है: मैं चला गया और वह किया। – sbi

+1

इसके अलावा, अगर आप strcmp (cms, c_str(), "exit") के बजाय cmd.compare ("exit") का उपयोग करते हैं तो यह क्लीनर है == 0 आप सी ++ कोड लिख रहे हैं। इसका लाभ क्यों नहीं लेते? – Vagrant

उत्तर

13

छोटे कीड़े की एक जोड़ी फिक्सिंग के बाद, यह मेरा मशीन पर काम करता है:

#include <cstdlib> 
#include <cstdio> 
#include <iostream> 
#include <cstring> 
#include <string> 

int main() 
{ 
     std::string cmd; 
     while(std::strcmp(cmd.c_str(),"exit")!=0 
      && std::strcmp(cmd.c_str(),"\\exit")!=0) 
     { 
       std::cin>>cmd; 
       std::cout<<cmd << '\n'; 
     } 
     return 0; 
} 

हालांकि, मुझे आश्चर्य है कि तुम क्यों बिल्कुल std::strcmp() उपयोग करना चाहते हैं। जैसा कि आपने अभी पाया है, std::string वर्ग के रूप में उपयोग करना उतना आसान नहीं है। यह

while(cmd!="exit" && cmd!="\\exit") 

बस काम करता है, समझने में आसान है, और इस प्रकार सही होना आसान है।

+0

ओपी तुलना करने से पहले इनपुट स्ट्रिंग को लोअरकेस में परिवर्तित करना चाहता है। यह उपयोगकर्ता को "बाहर निकलने" के साथ-साथ "बाहर निकलने" की अनुमति देता है। शोध के लिए शर्तें हैं: 'std :: transform' और' tolower'। –

+0

यूनिक्स (शायद विंडोज़ भी) सिस्टम पर 'strcasecmp' भी है, जो मामले को अनदेखा करता है। – Joe

4

strcmp 0 बराबर होने पर 0 लौटाता है। तो मुझे लगता है कि आप चाहते हैं! = 0

निश्चित रूप से strcmp दोनों के लिए 0 वापस नहीं आएगा, क्योंकि यह दोनों के बराबर नहीं हो सकता है।

यह भी लगता है कि आपकी स्ट्रिंग की शुरुआत में बैकस्लैश है, तो आपको इसे डबल बैकस्लैश से बचाना चाहिए।

2

अपने समय में हालत true का मूल्यांकन कभी नहीं होगा, क्योंकि आप की जाँच करने के cmd स्ट्रिंग "exit"और"\\exit" के बराबर है परीक्षण कर रहे हैं। एक स्ट्रिंग एक ही समय में दो मानों के बराबर नहीं हो सकती है।

11

std::string उदाहरण != या == ऑपरेटरों का उपयोग कर स्ट्रिंग अक्षर के साथ सीधे तुलना की जा सकती है। यह आपकी तुलना स्पष्ट बनाता है।

ध्यान दें कि \e मान्य वर्ण से बचने वाला नहीं है, तो आपको \ को दोगुना करने की आवश्यकता है यदि आपका मतलब शाब्दिक \\ है।

while(cmd == "exit" && cmd == "\\exit") 

जाहिर cmd एक ही समय में दो अलग-अलग तार के बराबर नहीं हो सकता है, शायद आप != मतलब है।

यह भी विचार करें कि std::getline(std::cin, cmd)std::cin >> cmd; से अधिक उचित है या नहीं। किसी भी मामले में आपको पढ़ने के ऑपरेशन की सफलता की जांच करनी चाहिए अन्यथा यदि स्ट्रीम बंद हो या विफल स्थिति में प्रवेश हो तो आप अनंत लूप में समाप्त हो सकते हैं।

व्यक्तिगत रूप से मैं इस तरह कुछ के साथ जाऊंगा, यह मानते हुए कि आप निकास कमांड को अपने कोड के रूप में गूंजना चाहते हैं।

#include <string> 
#include <iostream> 
#include <ostream> 

int main() 
{ 
    std::string cmd; 
    while (std::getline(std::cin, cmd)) 
    { 
     std::cout << cmd << std::endl; 
     if (cmd == "exit" || cmd == "\\exit") 
      break; 
    } 
    return 0; 
} 
+0

यह सही उत्तर है। –

0

आपकी समस्या थोड़ी देर की स्थिति है।

आप शायद, जब उपयोगकर्ता बाहर निकलने में प्रवेश करती है पाश से बाहर जाते हैं चाहते हो जाएगा तो आप का उपयोग करना चाहिए:

while(strcmp(cmd.c_str(),"exit")!=0 && strcmp(cmd.c_str(),"\exit")!=0) 
0

बस कुछ बातें ध्यान में रखने के लिए, मैं सुझाव है कि दोहरा लायक हैं में से कुछ को दोहराने कर रहा हूँ जबकि (1) बार।

  1. आप सी का उपयोग कर रहे ++, यह वस्तु उन्मुख है, जैसे कि, इसके लिए सबसे अच्छा एक साथ डेटा और समारोह है कि यह पर काम करता है गठबंधन करने के लिए।इस मामले में strcmp की बजाय स्ट्रिंग क्लास द्वारा प्रदान की गई स्ट्रिंग तुलना विकल्पों का उपयोग करें।

  2. आपके प्रोग्राम में एक तर्क त्रुटि है, ठीक है, यह संकलित होगा, लेकिन मुझे डर है कि आप जो चाहते हैं वह नहीं है। अगर (एक == x & & a == y) यह हमेशा गलत होगा, क्योंकि x और y के बराबर नहीं हो सकता है जब तक कि x = y, आपके मामले में स्पष्ट रूप से x! = y।

चीयर्स, पवन

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