以下代码的问题是,无论控制台中的输入是什么,所有函数都运行,就像它们是真的一样。举个例子,我可以输入“vvvvvvvvvvvvvvvv”并输出“hello”和“good thank you”。它好像功能的参数无关紧要。
#include <windows.h>
#include <iostream>
#include <string>
#include <chrono>
#include <thread>
void main()
{
void confirmChk(bool &confirm);
bool confirm = false;
void greetingChk(bool &greeting);
bool greeting = false;
void questionChk(bool &question);
bool question = false;
void youChk(bool &you);
bool you = false;
std::string text;
std::getline(std::cin, text);
for (int read = 0; read < text.length(); read++)
{
greetingChk(greeting);
if (greeting = true);
{
youChk(you);
if (you = true);
{
std::cout<<"hello" <<std::endl;
}
}
questionChk(question);
if (question = true);
{
youChk(you);
if (you = true);
{
std::cout<<"good thank you" <<std::endl;
}
}
std::chrono::milliseconds dura(2000);
std::this_thread::sleep_for(dura);
system("cls");
}
}
//////////////////Functions//////////////////
void greetingChk(bool &greeting)
{
std::string text;
std::getline(std::cin, text);
if(text.find("hi ") != std::string::npos ||
text.find("hello ") != std::string::npos ||
text.find("hey ") != std::string::npos ||
text.find("yo ") != std::string::npos ||
text.find("sup ") != std::string::npos ||
text.find("howdy ") != std::string::npos ||
text.find("wazzup ") != std::string::npos ||
text.find("hiya ") != std::string::npos)
{
greeting = true;
}
else
{
greeting = false;
}
}
void youChk(bool &you)
{
std::string text;
std::getline(std::cin, text);
if(text.find("ya ") != std::string::npos ||
text.find("you ") != std::string::npos ||
text.find("yah ") != std::string::npos ||
text.find("yall ") != std::string::npos ||
text.find("you're ") != std::string::npos)
{
you = true;
}
else
{
you = false;
}
}
void questionChk(bool &question)
{
std::string text;
std::getline(std::cin, text);
if(text.find("are") != std::string::npos ||
text.find("am") != std::string::npos ||
text.find("can") != std::string::npos ||
text.find("could") != std::string::npos ||
text.find("do") != std::string::npos ||
text.find("does") != std::string::npos ||
text.find("did") != std::string::npos ||
text.find("has") != std::string::npos ||
text.find("had") != std::string::npos ||
text.find("have") != std::string::npos ||
text.find("is") != std::string::npos ||
text.find("may") != std::string::npos ||
text.find("might") != std::string::npos ||
text.find("shall") != std::string::npos ||
text.find("should") != std::string::npos ||
text.find("was") != std::string::npos ||
text.find("would") != std::string::npos ||
text.find("were") != std::string::npos)
{
question = true;
}
else
{
question = false;
}
}
void confirmChk(bool &confirm)
{
std::string text;
std::getline(std::cin, text);
if(text.find("ok") != std::string::npos ||
text.find("yup") != std::string::npos ||
text.find("yes") != std::string::npos ||
text.find("affirm") != std::string::npos ||
text.find("affirmative") != std::string::npos ||
text.find("confirm") != std::string::npos ||
text.find("confirmed") != std::string::npos ||
text.find("confirming") != std::string::npos ||
text.find("endorse") != std::string::npos ||
text.find("endorsed") != std::string::npos ||
text.find("approve") != std::string::npos ||
text.find("approved") != std::string::npos ||
text.find("approving") != std::string::npos ||
text.find("of course") != std::string::npos ||
text.find("got it") != std::string::npos ||
text.find("will do") != std::string::npos ||
text.find("alright") != std::string::npos ||
text.find("fine") != std::string::npos ||
text.find("varify") != std::string::npos ||
text.find("ratify") != std::string::npos ||
text.find("validate") != std::string::npos ||
text.find("understood") != std::string::npos ||
text.find("justify") != std::string::npos)
{
confirm = true;
}
else
{
confirm = false;
}
}
答案 0 :(得分:0)
我几乎不知道从哪里开始。您的主循环执行的次数与输入字符串中的字符数相同。
您的所有if
语句 都是真的,因为您可以这样设置。
说
if(greeting = true);
首先将greeting
设置为true
,然后不执行任何操作(因为条件子句后面的分号)。
括号内的以下语句将被执行,因为它们不是if
的一部分。再次,因为条件子句后面的分号。
使用更像
的内容if (greeting)
{
// conditional code here
}
我认为你的意思是if (greeting == true)
与if (greeting)
相同。
答案 1 :(得分:0)
这是您的一个问题:您正在使用赋值运算符=
而不是等于运算符==
。所以,当你使用:
if (greeting = true)
...你在说&#34;将问候语设为真。如果此操作的结果返回true,则...&#34;您想要使用的是:
if (greeting == true)
这说&#34;比较问候语为真。如果此操作的结果返回true(即如果它们相等),那么......&#34;但是,你可以用这个更简洁一点:
if (greeting)
答案 2 :(得分:0)
您的if
语句中有更多条目,然后是少女电话。 :-)
你应该投资一些结构,容器和循环。 例如:
const static std::string question_words[] =
{"am", "are", "can", "did", "could", "do", "does"};
const static unsigned int word_quantity =
sizeof(question_words) / sizeof(question_words[0]);
//...
bool is_question = false;
for (unsigned int i = 0; i < word_quantity; ++i)
{
if (text == question_word[i])
{
is_question = true;
break;
}
}
您可以将此逻辑放入函数中,并将字数组和单词传递给它。这样,您可以为不同的单词容器调用该函数,而不是编写额外的代码。你的代码就像:
bool is_question = false;
is_question = Is_Word_In_Array(question_words, word_quantity, text);
if (is_question)
{
cout << "sentence is a question\n";
}
if (Is_Word_In_Array(greeting_words, greeting_word_quantity, text))
{
cout << "sentence has a greeting.\n";
}
如果对数组进行排序,则可以使用现有搜索功能(如std::binary_search
)来查找单词。