2015-05-06 5 views
-2

Для школьного задания мне нужно проверить, сохранена ли строка, введенная пользователем, в заранее определенном массиве слов.Проверьте, существует ли строка в массиве

Я хочу реализовать функцию для выполнения проверки, что может выглядеть следующим образом:

bool exists(dict words, char check) { /* how to implement this? */ } 

Но я понятия не имею, будет ли это работать или как реализовать его. Может ли кто-нибудь помочь?

Вот мой код:

#include <iostream> 
#include <string> 

using namespace std; 

struct dict { 
    string word; 
}; 

int main() { 
    dict words[5]; 
    words[0].word = 'abc'; 
    words[1].word = 'bcd'; 
    words[2].word = 'cde'; 
    words[3].word = 'def'; 
    words[4].word = 'efg'; 

    char user_input[100]; 
    cin.getline(user_input, 100); 
    if (...) { // how do I check if the user input is in my word array? 
     cout << "found\n"; 
    } 
    else { 
     cout << "not found\n"; 
    } 
} 
+2

Подробнее о циклах –

+3

... и строковых литералах. – WhozCraig

+0

И словари. –

ответ

1

Прежде всего, dict является структура и char имеет тип в состоянии держать один символ, так что вы скорее должны были бы иметь:

bool exists(const dict* words, const string& check);

С этого момента я бы сказал, что:

  • const dict* следует изменить на const vector<dict>&.
  • std::getline способен read input directly into string, поэтому не требуется простой массив символов.

Но так как это назначение школы, я полагаю, что у вас есть некоторые ограничения (и не может использовать ни std::vector, ни std::find, что будет делать эту работу). Итак:

bool exists(const dict* words, size_t count, const std::string& check) 
{ 
    for(size_t n = 0; words && (n < count); ++n) 
    { 
     if(words[n].word == check) 
      return true; 
    } 

    return false; 
} 

Пример:

dict langs[3]; 

langs[0].word = "C++"; 
langs[1].word = "Java"; 
langs[2].word = "Python"; 

std::string s_1 = "Java"; 
std::string s_2 = "C++ 11"; 

printf("exists(%s) : %s\n", s_1.c_str(), exists(langs, 3, s_1) ? "yes" : "no"); 
printf("exists(%s) : %s\n", s_2.c_str(), exists(langs, 3, s_2) ? "yes" : "no"); 

Выход:

exists(Java) : yes 
exists(C++ 11) : no 

Link to sample code.

1

Как уже указывалось в другом ответе, вы должны добавить параметр размера к сигнатуре функции, чтобы иметь возможность итерировать массив (особенно знать, когда остановить итерацию). Тогда простой цикл со сравнением сделает трюк.

Обратите внимание, что обычно не нужно использовать необработанные массивы на C++, а один из контейнеров из стандартной библиотеки, например, std::vector. Кроме того, вы должны использовать std::string и std::getline() для ввода вашего пользователя, и вы должны исправить свои строковые литералы (используйте двойные кавычки «...» вместо одинарных кавычек «...»). Кроме того, вам следует избегать using namespace std;. Взгляните на ссылки в конце этого сообщения для дальнейшего чтения по этим вопросам.

Пример кода:

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

bool exists(std::string const & user_input, 
      std::vector<std::string> const & words) 
{ 
    for (int i = 0; i < words.size(); i++) 
     if (user_input == words[i])   
      return true; 
    return false; 
} 

int main() { 
    std::vector<std::string> words(5); 
    words[0] = "abc"; 
    words[1] = "bcd"; 
    words[2] = "cde"; 
    words[3] = "def"; 
    words[4] = "efg"; 

    std::string user_input; 
    std::getline(std::cin, user_input); 
    if (exists(user_input, words)) 
     std::cout << "found\n"; 
    else 
     std::cout << "not found\n"; 
} 

Пример вывода:

$ g++ test.cc && echo "abc" | ./a.out 
found 

Следующая может быть выходит за рамки вашего школьного задания, но, возможно, это будет полезно для будущих посетителей этого вопрос.

Обратите внимание, что массив (который std::vector is) не является наиболее эффективной структурой данных для выполнения такого рода задач, так как вы должны итерировать весь массив, чтобы проверять каждый элемент (линейная сложность).

Стандартная библиотека C++ также предоставляет типы контейнеров std::set и std::unordered_set (последняя с C++ 11). Здесь пространство поиска организовано особым образом (двоичное дерево поиска: логарифмическая сложность, хеш-таблица: постоянная сложность в среднем), чтобы улучшить время поиска ключевого типа (std::string в этом случае).

Вот пример:

#include <iostream> 
#include <string> 
#include <set> 

typedef std::set<std::string> set_type; 

bool input_exists(std::string input, set_type const & words) { 
    return words.find(input) != words.end(); 
} 

int main() { 
    set_type words = {"abc", "bcd", "cde", "def", "efg"}; 
    std::string input; 
    if (std::getline(std::cin, input)) { 
     std::cout << "input: '" << input << "' "; 
     if (input_exists(input, words)) 
      std::cout << "found\n"; 
     else 
      std::cout << "not found\n"; 
    } 
} 

Пример вывода:

$ g++ test.cc -std=c++11 
$ echo "abc" | ./a.out 
input: 'abc' found 
$ echo "abcdefg" | ./a.out 
input: 'abcdefg' not found 

Для справки:

Смежные вопросы