我已经做了一个测验助手,但是,因为我想让你能够在不启动它的情况下输入新问题,我做了一个do / while循环。第一轮运行顺利。当它询问您是否要输入另一个问题时,如果选择y,它也会同时运行主程序,程序会将y记录为问题。我该如何分开?代码:
#include <cctype>
#include <iostream>
#include <string>
#include "Quiz.h"
#include "Quiz2.h"
char choice;
int main()
{
do{
quiz();
std::cout << "Da li zelite da vam odgovorim na jos jedno pitanje?(y/n)" << std::endl;
std::cin >> choice;
} while(choice != 'n');
}
第一个头文件只包含查找单词的功能:
#ifndef QUIZ_H_INCLUDED
#define QUIZ_H_INCLUDED
bool contains_word(const std::string& sentence, const std::string& word)
{
size_t pos = 0;
while ((pos = sentence.substr(pos).find(word)) != std::string::npos) {
if (!(isalpha(sentence[pos - 1])) || !(isalpha(sentence[pos + word.size() + 1])))
return true;
}
return false;
}
#endif
另一个包含真实代码,部分包含塞尔维亚语:
#ifndef QUIZ2_H_INCLUDED
#define QUIZ2_H_INCLUDED
int quiz()
{
std::string sentence;
std::cout << "Ukucajte pitanje ili kljucne reci: " << std::flush;
std::getline(std::cin, sentence);
std::string word ("Belgija");
std::string word2 ("regija");
std::string word3 ("Kanada");
std::string word4 ("teritorija");
std::string word5 ("Holandija");
std::string word6 ("delova");
if (contains_word(sentence, word) && contains_word(sentence, word2))
std::cout << "Odgovor je 3 regije." << std::endl;
else if (contains_word(sentence, word3) && contains_word(sentence, word4))
std::cout << "Odgovor je 3 teritorije." << std::endl;
else if (contains_word(sentence, word5) && contains_word(sentence, word6))
std::cout << "Odgovor je 3 dela." << std::endl;
else
std::cout << "Nisam mogao pronaci odgovor na to pitanje!" << std::endl;
return 0;
}
#endif
感谢任何帮助。
答案 0 :(得分:0)
选择后会有换行符,所以只需添加cin.ignore
:
std::cin >> choice;
std::cin.ignore();
它会忽略输入中的一个字符。
或者,您可以放弃quiz()
函数中的所有空行 - 替换
std::getline(std::cin, sentence);
与
do {
std::getline(std::cin, sentence);
} while( sentence.empty() );
应更正contains_word
功能。如果单词可能位于句子的最后(下标超过数组末尾),则不应该获得sentence[pos + word.size() + 1]
的值。
sentence[pos - 1]
中的类似错误 - 如果pos为0会怎么样?你在字符串之前得到一些随机的东西。
你必须重新修改条件 - 当然if( !(...) || !(...) )
不是你想要的。
应该是这样的:
bool contains_word(const std::string& sentence, const std::string& word)
{
size_t pos = 0;
while ((pos = sentence.substr(pos).find(word)) != std::string::npos) {
if( (pos == 0 || isalpha(sentence[pos - 1])) &&
(pos + word.size() == sentence.size() || isalpha(sentence[pos + word.size()])) )
return true;
}
return false;
}
答案 1 :(得分:-1)
getline()
和cin
不能很好地配合。在cin
操作之后,输入流中通常会留下getline
读取的新行,并立即结束它。你可以解决&#34;通过两次调用getline
并忽略第一个结果来解决问题。但请注意,这仅在调用cin
后发生,因此第一次通过时不应使用getline
两次。这就是为什么我说他们不能在一起玩得很好而且#34;。