由于某种原因,此代码在获得多个输入后打印出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();
}
答案 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;