如何在10个元素的字符串数组中查找字符串

时间:2017-07-13 22:45:22

标签: c++ arrays find getline

我正在尝试创建一个函数,要求用户提供他们正在查找的dvd标题,该标题位于以下格式的文本文件中:

标题:流派:价格

文本文件中有10行都遵循该格式。 我首先将每一行放入一个包含10个元素的数组中。

我有一个DVD类,它具有我试图创建的函数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类对象在main中调用此函数。我知道find函数返回一个迭代器 一旦找到元素,我就无法弄清楚如何在元素被找到后打印出来。 我的输出只是简单地写了标题的第一个单词(&#34; Free&#34;在Free Willy中)9次,而不仅仅是 它在其中一个数组元素中找到Free Willy。 我也尝试过使用

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变量的冒号中,我在打印出标题是否有库存之前测试了是否(dvdTest == title)。 我得到一个错误,说调用getline没有匹配的函数,所以我认为getline不适用于数组。 然后我尝试了

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;

我尝试输入Avatar(文本文件中的第5个标题)并输出&#34;抱歉,我们没有该标题。&#34;,所以它要么找不到头像或者它每次通过for循环检查文件的第一行? 是否有可能以类似的方式完成我尝试做的事情,或者这是一种完全错误的做法,我应该以不同的方式做到这一点?

我现在每天花几个小时检查cplusplus,连续3天查看文件使用情况,getline,查找,我无法解决任何问题。

3 个答案:

答案 0 :(得分:1)

将字符串放入vector并使用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::beginstd::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 :(得分:1)

如果您使用的是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;

答案 2 :(得分:1)

问题是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)Other options ...

编辑: 解释正则表达式(tutorial

  1. 第一个括号 - 匹配不是冒号的所有内容,这是匹配的第1组
  2. 匹配冒号
  3. 第二个括号 - 匹配不是冒号的所有内容,这是匹配的第2组
  4. 匹配冒号
  5. 第三个括号 - 匹配不是冒号的所有内容,这是匹配的第3组
  6. 代码:

    // 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();
    }