如果用户输入多于一个单词,则输出额外的字符串

时间:2016-08-12 06:35:00

标签: c++ arrays function struct computer-science

这是我第一次在这里问一个问题,所以要温柔哈哈。我编写了一些代码,用于从(library.txt datatbase)文件中获取信息,将其存储在数组中,然后按标题/作者访问/搜索这些数组,然后根据用户输入的内容为用户输出该信息

我遇到的问题是,每当用户输入长于一个单词的搜索词时,输出"输入Q到(Q)uit,搜索(A)uthor,搜索(T)itle, (S)All:"在关闭之前重复几次。

我只是想让这个值得我的教授大声笑。请帮帮我。

#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>

using namespace std;

struct Book
{
    string title;
    string author;
};

int loadData(string pathname);
char switchoutput();
void showAll(int count);
int showBooksByAuthor(int count, string name);
int showBooksByTitle(int count, string title);
int FindAuthor(int count, string userinput);
int FindTitle(int count, string userinput);
void ConvertStringToLowerCase(const string orig, string& lwr); //I found     this program useful to convert any given string to lowercase, regardless of user input


const int ARRAY_SIZE = 1000;

Book books[ARRAY_SIZE];

int main()
{
string pathname;
string name;
string booktitle;
int count = 0;
int counta = 0;
int countt = 0;
char input = 0;

cout << "Welcome to Jacob's Library Database." << endl;
cout << "Please enter the name of the backup file: " ;

cin >> pathname;

count = loadData(pathname);

cout << count << " records found in the database." << endl;

while (toupper(input != 'Q'))
{
    input = switchoutput(); // function call for switchoutput function

    switch (input)
    {
    case 'A':
        cout << "Author's Name: ";
        cin >> name;
        counta = showBooksByAuthor(count, name);
        cout << counta << " records found." << endl;
        break;
    case 'T':
        cout << "Book Title: ";
        cin >> booktitle;
        countt = showBooksByTitle(count, booktitle);
        cout << countt << " records found." << endl;
        break;
    case 'S':
        showAll(count);
        break;
    case 'Q':
        break;
    }
}

//Pause and exit

cout << endl << "Press 'ENTER' to quit";

getchar();
getchar();

return 0;
}

int loadData(string pathname) //loading data into the array of structs
{
ifstream inFile;


inFile.open(pathname);


if (!inFile) {
    cout << "Error, could not read into file. Please re-compile." << endl;

    system("PAUSE");

    exit(1); //if not in file, exit;
}

int i = 0;
while (!inFile.eof()) {

    getline(inFile, books[i].title);
    getline(inFile, books[i].author);

    i++;
}
return i;
}


char switchoutput() //seperate output function to get my characteroutput     constantly resetting and returning the uppercase version for my switch
{
char input;

cout << "Enter Q to (Q)uit, Search (A)uthor, Search (T)itle, (S)how All: ";

cin >> input;

return toupper(input);
}

int showBooksByAuthor(int count, string name) 
{
int authorcount = 0;

authorcount = FindAuthor(count, name);

return authorcount;
}

int showBooksByTitle(int count, string title)
{
int titlecount = 0;

titlecount = FindTitle(count, title);

return titlecount;
}

void showAll(int count)
{
for (int i = 0; i < count; i++)
{
    cout << books[i].title << " (" << books[i].author << ")" << endl;
}
}

int FindAuthor(int count, string userinput)
{
int authorcount = 0;
string stringlower, arraylower;
int num;

// called upon function to lowercase any of the user inputs
ConvertStringToLowerCase(userinput, stringlower);

for (int i = 0; i < count; ++i) //this function's count determines at which     locations to output the author and names (an argument from books by author)
{
    // called upon function to lowercase any of the stored authors'
    ConvertStringToLowerCase(books[i].author, arraylower);

    num = arraylower.find(stringlower); // searches string for userinput (in     the lowered array) and stores its value

    if (num > -1) // you can never get a -1 input value from an array, thus this loop continues until execution
    {
        cout << books[i].title << " (" << books[i].author << ")" << endl;     //cout book title and book author
        authorcount++; //count
    }
}
return authorcount;
}

int FindTitle(int count, string userinput) //same as previous but for titles
{
int titlecount = 0;
string stringlower, arraylower;
int num;


ConvertStringToLowerCase(userinput, stringlower);

for (int i = 0; i < count; ++i)
{

    ConvertStringToLowerCase(books[i].title, arraylower);

    num = arraylower.find(stringlower);
    if (num > -1)
    {
        cout << books[i].title << " (" << books[i].author << ")" << endl;

        titlecount++; //count
    }
}

return titlecount;
}

void ConvertStringToLowerCase(const string orig, string& lwr) // I found this from another classmate during tutoring, I thought to be useful.
{
lwr = orig;

for (int j = 0; j < orig.length(); ++j) //when called upon in my find     functions, it takes the string and convers the string into an array of lowercase letters
{
    lwr[j] = tolower(orig.at(j));
}
}

0 个答案:

没有答案