检查数组中是否存在字符串

时间:2015-05-06 06:23:04

标签: c++

对于学校作业,我需要检查用户输入的字符串是否存储在预定义的单词数组中。

我想实现一个执行检查的函数,可能如下所示:

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 个答案:

答案 0 :(得分:1)

首先,dict是一个结构,而char是能够容纳单个字符的类型,所以您宁愿需要:

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

从这一点来说,我会说:

但是,因为它是一项学校作业,我想,你有一些限制(并且不能同时使用std::vectorstd::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 :(得分:1)

正如另一个答案已经指出的那样,你应该在函数签名中添加一个size参数,以便能够迭代数组(尤其是知道何时停止迭代)。然后一个简单的循环进行比较就可以了。

请注意,您通常不需要在C ++中使用原始数组,而是使用标准库中的一个容器,例如std::vector。此外,您应该使用std::stringstd::getline()作为用户输入,并且应该修复字符串文字(使用双引号&#34; ...&#34;而不是单引号&#39 ; ...&#39;)。此外,你应该无情地避免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是)不是执行此类任务的最有效数据结构,因为您必须迭代整个数组以检查每个项目(线性复杂性)。

C ++标准库还提供容器类型std::setstd::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

供参考: