मैं एक ऐसा फ़ंक्शन बनाने का प्रयास कर रहा हूं जो उपयोगकर्ता को एक डीवीडी शीर्षक के लिए पूछता है जिसे वे ढूंढ रहे हैं जो प्रारूप की टेक्स्ट फ़ाइल में स्थित है:

शीर्षक: शैली: मूल्य

टेक्स्ट फ़ाइल में 10 पंक्तियाँ हैं जो सभी उस प्रारूप का अनुसरण करती हैं। मैंने पहली बार प्रत्येक पंक्ति को 10 तत्वों के साथ एक सरणी में रखा।

मेरे पास एक डीवीडी क्लास है जिसमें फ़ंक्शन getTitle() है जिसे मैं बनाने की कोशिश कर रहा हूं:

void DVD::getTitle(){
    cout << "Type the title of the dvd you're looking for." << endl;
    cin >> title;

    for(int i = 0; i < 10; i++){ //Loop through the dvd array object.

        if(dvd[i].find(title)){ //Test if the title entered is in any of the array elements
            cout << "We have " << title << " in stock." << endl;
        }
    }
    cout << "Sorry we don't have that title." << endl;
}

इस फ़ंक्शन को मुख्य रूप से DVD क्लास ऑब्जेक्ट के साथ कॉल किया जाता है। मुझे पता है कि खोज फ़ंक्शन एक बार मिलने के बाद तत्व को एक पुनरावर्तक देता है, लेकिन मैं यह नहीं समझ सकता कि तत्व को एक बार कैसे प्रिंट किया जाए। मेरा आउटपुट केवल शीर्षक के पहले शब्द (फ्री विली में "फ्री") को केवल 9 बार लिखता है, इसके बजाय केवल जब यह सरणी तत्वों में से एक में फ्री विली पाता है। मैंने भी उपयोग करने की कोशिश की

for(int i = 0; i < 10; i++){ //Loop through the dvd array object.

    //Attempt to search each array element up to the colon, and place the 
    //strings before the colon in dvdTest.
    getline(dvd[i], dvdTest, ':');

    //Test if the string elements before the colon are the same as the title entered.
    if(dvdTest == title){
        cout << "We have " << title << " in stock." << endl;
    }
}
cout << "Sorry we don't have that title." << endl;

DVDTest वेरिएबल में रखे कोलन तक सभी मौजूदा ऐरे एलिमेंट को आज़माने और प्राप्त करने के लिए, मैंने प्रिंट करने से पहले if(dvdTest == title) का परीक्षण किया कि शीर्षक स्टॉक में है या नहीं। मुझे यह कहते हुए एक त्रुटि मिली कि कॉल टू गेटलाइन के लिए कोई मिलान फ़ंक्शन नहीं है, इसलिए मुझे लगा कि गेटलाइन सरणियों पर लागू नहीं होती है। मैंने फिर कोशिश की

for(int i = 0; i < file.eof(); i++){ //Loop through the lines in the file.

    //Get strings from the current line up to the colon, place into dvdTest.
    getline(file, dvdTest, ':');

    if(dvdTest == title){ //Test if dvdTest and the title entered are the same.
        cout << "We have " << title << " in stock." << endl;
    }
}
cout << "Sorry we don't have that title." << endl;

मैंने अवतार टाइप करने की कोशिश की (पाठ फ़ाइल में 5 वां शीर्षक) और यह बस "क्षमा करें हमारे पास वह शीर्षक नहीं है" आउटपुट करता है, इसलिए इसे या तो अवतार नहीं मिला या यह हर बार फ़ाइल की पहली पंक्ति की जांच कर रहा है। लूप के माध्यम से? क्या मैं जो करने की कोशिश कर रहा हूं उसे पूरा करना संभव है, या यह पूरी तरह गलत दृष्टिकोण है और मुझे इसे एक अलग तरीके से करना चाहिए?

मैंने फ़ाइल उपयोग, गेटलाइन, खोज पर अब 3 दिनों के लिए दिन में कुछ घंटे cplusplus की जाँच की है, और मुझे कुछ भी पता नहीं चल रहा है।

0
MaxV 14 जुलाई 2017, 01:45

3 जवाब

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

समस्या यह है कि cin >> title पूरी लाइन में नहीं पढ़ता है। यह केवल वर्णों को तब तक पढ़ता है जब तक यह व्हॉट्सएप तक नहीं पहुंच जाता।

इनपुट की पूरी पंक्तियों को पढ़ने के लिए आपको इसका उपयोग करना होगा:

std::string line;
while ( std::getline(cin, line) ) 
{
    // .... do something with line
}

line के साथ कुछ कैसे करें? (कोड में हाइपरलिंक)

1) आप सेमी को खोजने के लिए line.find(':') का उपयोग कर सकते हैं बृहदान्त्र की स्थिति और फिर उप को निकालने के लिए line.substr(pos_from, char_count) का उपयोग करें -स्ट्रिंग।

2) आप इस स्ट्रिंग को विभाजित करने के लिए रेगुलर एक्सप्रेशन std::regex("([^:]*):([^:]*):([^:]*)") का उपयोग कर सकते हैं यूपी। और फिर regex_match का उपयोग करें विशेष टुकड़े निकालने के लिए।

3) अन्य विकल्प ...


संपादित करें: रेगेक्स की व्याख्या करने के लिए (ट्यूटोरियल)

  1. पहला कोष्ठक - हर उस चीज़ का मिलान करें जो कोलन नहीं है, यह मेल खाने वाला समूह है 1
  2. एक कोलन का मिलान करें
  3. दूसरा कोष्ठक - हर उस चीज़ का मिलान करें जो एक कोलन नहीं है, यह मेल खाने वाला समूह है 2
  4. एक कोलन का मिलान करें
  5. तीसरा कोष्ठक - हर उस चीज़ का मिलान करें जो एक कोलन नहीं है, यह मेल खाने वाला समूह है 3

कोड:

// Extraction of a sub-match (matching group) 
const std::regex match_regex("([^:]*):([^:]*):([^:]*)");
std::smatch matched_strings;

if (std::regex_match(line, matched_strings, match_regex)) {
     std::string first_match = matched_strings[1].str();
     std::string second_match = matched_strings[2].str();
     std::string third_match = matched_strings[3].str();
}
1
Robert Andrzejuk 29 अगस्त 2017, 10:59

यदि आप c स्ट्रिंग का उपयोग कर रहे हैं, const char*, तो आपको जरूरी strcmp(str1, str2) का उपयोग करना चाहिए:

#include <string>
...
bool found = false;

//Loop through the dvd array object
for(int i = 0; !found && i < 10; i++){ 
    //Is the title entered in any of the array elements?  
    found = (strcmp(dvd[i].title, title) == 0;
}

if (found)
    cout << "We have " << title << " in stock." << endl;
else
    cout << "Sorry we don't have that title." << endl;

अन्यथा, केवल == का उपयोग करके std::string की तुलना करें:

//Loop through the dvd array  object.
for(int i = 0; !found && i < 10; i++){ 
    //Is the title entered in any of the array elements?  
    found = (dvd[i].title == title);
}

if (found)
    cout << "We have " << title << " in stock." << endl;
else
    cout << "Sorry we don't have that title." << endl;
1
Lifka 14 जुलाई 2017, 02:21

स्ट्रिंग्स को वेक्टर में रखें और std::find फ़ंक्शन:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

int main(){
    std::vector<std::string> v{ "Movie 1", "Movie 2", "Movie 3" };
    std::cout << "Enter the movie title to find: ";
    std::string whattofind;
    std::getline(std::cin, whattofind);
    auto found = std::find(v.begin(), v.end(), "Movie 2");
    if (found != std::end(v)) {
        std::cout << "v contains: " << whattofind << '\n';
    }
    else {
        std::cout << "v does not contain: " << whattofind << '\n';
    }
}

यदि आप किसी सरणी का उपयोग करना चाहते हैं तो std::begin और std::end फ़ंक्शंस का उपयोग करें जिसके बाद std::find:

std::string movies[] = { "Movie 1", "Movie 2", "Movie 3" };
std::string whattofind = "Movie 2";
auto found = std::find(std::begin(movies), std::end(movies), "Movie 2");
if (found != std::end(movies)) // ... same as above

आप अकेले std::cin का उपयोग करके मानक इनपुट से एक स्ट्रिंग स्वीकार नहीं कर सकते। आपको इसके बजाय std::getline फ़ंक्शन का उपयोग करने की आवश्यकता है:

std::string tempstr;
std::getline(std::cin, tempstr);
1
Ron 14 जुलाई 2017, 03:12