随机打印出int的大小,不明白为什么

时间:2017-05-11 11:12:40

标签: c++ int

由于某种原因,此代码在获得多个输入后打印出int的大小。我是c ++的初学者,如果有人能帮助我并帮助我理解为什么会这样,我会非常感激。感谢。

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

int calculateVowelIndex(std::string input)
{
float numVowel = 0, numCon = 0;
int vowelIndex;

std::vector<char> vowels{ 'a', 'e', 'i', 'o', 'u', 'y' };

std::transform(input.begin(), input.end(), input.begin(), ::tolower);

for (int x = 0; x < input.length(); ++x)
{
    if (std::find(vowels.begin(), vowels.end(), input[x]) != vowels.end())
        ++numVowel;

    else
        ++numCon;
}

vowelIndex = numVowel / (numVowel + numCon) * 100;

return vowelIndex;
}

int main()
{
int n;
std::string input;
std::vector<std::string> words;
std::vector <unsigned int> vowelIndexes;
std::cin >> n;

for (int x = 0; x < n; ++x)
{
    std::getline(std::cin, input);
    words.push_back(input);
    vowelIndexes.push_back(calculateVowelIndex(input));
}

for (int x = 0; x < words.size(); ++x)
{
    std::cout << vowelIndexes.at(x) << " " << words.at(x) << std::endl;
}

std::cin.get();
}

1 个答案:

答案 0 :(得分:2)

我最好的猜测是,这是因为当您输入输入时,最终会有一个额外的换行符,然后在std::getline的第一次迭代中被吞噬。一旦您输入了单词数量的输入,std::cin的缓冲区可能如下所示:

"3\n"

std::cin >> n;解析整数并在到达换行符时停止,将其保留在std::cin中:

"\n"

然后第一次调用std::getline读取所有字符(这里没有字符),直到它到达换行符('\n'),然后读取并丢弃,在std::cin中不留任何内容{1}}。因此读入一个空行并在第一次迭代时传递给函数。

这留下了两次循环迭代。接下来两次调用std::getline没有输入来从std::cin读取,因此它会提示您输入更多内容,然后循环会相应地处理它。

  

如果我输入3,然后输入2个单词,在第二个单词之后输出一个int的大小(2,147,483,647)并且不允许我输入第三个单词。

这就是为什么会发生这种情况:读入一个被遗忘的换行符并将其作为空行的结尾。

为了解决这个问题,我们必须阅读该行中剩余的任何字符并在读取更多行之前将其丢弃。这可以使用std::cin上的ignore方法完成,如下所示:

// ...
std::cin >> n;

// skip the rest of the line
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

for (int x = 0; x < n; ++x)
// ...

std::numeric_limits位于<limits>。这会读取并丢弃每个字符,直到遇到换行符,然后读取并丢弃该字符。

或者,因为看起来你只想要一个单词,为什么不只使用读一个单词的方法呢?

std::cin >> input;