我正在尝试创建一个函数,要求用户提供他们正在查找的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,查找,我无法解决任何问题。
答案 0 :(得分:1)
#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 :(得分: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
提取特定的部分。
编辑: 解释正则表达式(tutorial)
代码:
// 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();
}