对于学校作业,我需要检查用户输入的字符串是否存储在预定义的单词数组中。
我想实现一个执行检查的函数,可能如下所示:
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";
}
}
答案 0 :(得分:1)
首先,dict
是一个结构,而char
是能够容纳单个字符的类型,所以您宁愿需要:
bool exists(const dict* words, const string& check);
从这一点来说,我会说:
const dict*
应更改为const vector<dict>&
。std::getline
能够read input directly into string,因此不需要普通的char数组。但是,因为它是一项学校作业,我想,你有一些限制(并且不能同时使用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
答案 1 :(得分:1)
正如另一个答案已经指出的那样,你应该在函数签名中添加一个size参数,以便能够迭代数组(尤其是知道何时停止迭代)。然后一个简单的循环进行比较就可以了。
请注意,您通常不需要在C ++中使用原始数组,而是使用标准库中的一个容器,例如std::vector
。此外,您应该使用std::string
和std::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::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
供参考: