分开两个输入C ++

时间:2014-12-03 21:56:58

标签: c++

我已经做了一个测验助手,但是,因为我想让你能够在不启动它的情况下输入新问题,我做了一个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

感谢任何帮助。

2 个答案:

答案 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;。