为什么这不要求用户提供其他输入?

时间:2015-03-17 22:43:32

标签: c++ c++11 visual-c++

这是一个较大项目的一部分。现在它应该向用户询问一个字符串,计算其中有多少个单词,打印出单词数量,询问用户是否要再次执行,然后如果他们想要,请求另一个字符串,依此类推。但这只是第一次工作正常。之后,它将是/否问题的答案作为测试字符串。例如:我喜欢编码。再来一次?是/否。是。再说一遍?是/否......有人能告诉我如何修复这个故障吗?

#include <iostream>
#include <string>
using namespace std;

string original[10] = { "hello", "sir", "madam", "officer", "stranger", "where", "is", "the", "my", "your" };
string translated[10] = { "ahoy", "matey", "proud beauty", "foul blaggart", "scurvy dog", "whar", "be", "th'", "me", "yer" };
string input;
string ans;

bool playAgain()
{
cout << "Another? yes/no: ";
cin >> ans;
if (ans.compare("yes") == 0) { return true; }
if (ans.compare("no") == 0) { return false; }
}

int getNumOfWords(string input)
{
    int numOfSpaces = 0;
    string current;
    for (int i = 0; i < input.length(); i++)
    {
        current = input.at(i);
        if (current.compare(" ") == 0)
        {
            numOfSpaces++;
        }
    }
    return numOfSpaces + 1;
}

void play(string input)
{
    int numOfWords = getNumOfWords(input);
    cout << numOfWords << endl;
}

void start()
{
    getline(cin, input);
    play(input);
}

int main()
{
    bool playing;
    do
    {
        start();
        playing = playAgain();
    } while (playing);
    return 0;
}

2 个答案:

答案 0 :(得分:2)

cin.getline()从输入中读取时,输入流中会留下换行符,因此它不会读取您的c-string。使用cin.ignore() beore调用getline()

void start()
{   cin.ignore();
    getline(cin, input);
    play(input);
}

答案 1 :(得分:0)

这是因为getlinecout之间存在差异。前者在整行中读取并包括终止\n,而cout将只读取\n或空格。您的代码中的cin会在ans中显示“是”或“否”(尝试立即将其打印出来),但它并未考虑\n。因此,当您调用getline时,它会在stdin中找到\n等待,因此将其读入input而不是阻塞,直到cin为空。