我显然没有完全得到C ++的“文件结束”概念,因为下面的程序并没有超越“while(cin>> x)”步骤。每当我从命令行运行它时,它就会嘲笑我。
通过搜索SO和其他地方进行搜索会提到很多提及命中ctrl-z然后按Enter键在Windows上输入文件结尾字符,但这似乎对我不起作用。这让我觉得我的问题在别的地方。也许将x定义为字符串是我的错误?关于我在哪里出错的任何建议都会很棒。
注意:抱歉代码中缺少注释 - 程序本身应该采用一系列注释 单词,然后吐出每个单词的计数。
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <iomanip>
using std::cin;
using std::cout; using std::endl;
using std::sort;
using std::string; using std::vector;
int main()
{
cout << "Enter a series of words separated by spaces, "
"followed by end-of-file: ";
vector<string> wordList;
string x;
while (cin >> x)
wordList.push_back(x);
typedef vector<string>::size_type vec_sz;
vec_sz size = wordList.size();
if (size == 0) {
cout << endl << "This list appears empty. "
"Please try again." << endl;
return 1;
}
sort(wordList.begin(), wordList.end());
cout << "Your word count is as follows:" << endl;
int wordCount = 1;
for (int i = 0; i != size; i++) {
if (wordList[i] == wordList[i+1]) {
wordCount++;
}
else {
cout << wordList[i] << " " << wordCount << endl;
wordCount = 1;
}
}
return 0;
}
答案 0 :(得分:3)
如果你在Windows上^ Z必须作为换行符之后的第一个字符,如果你在unixy shell上,那么你想键入^ D.
答案 1 :(得分:1)
代码的输入部分有效。我看到的唯一真正的问题是循环试图计算单词:
for (int i = 0; i != size; i++) {
if (wordList[i] == wordList[i+1]) {
wordList的有效下标从0到大小为1。在循环的最后一次迭代中,i = size-1,但是您尝试使用wordList[i+1]
,索引超出向量的末尾并获得未定义的结果。如果您使用wordList.at(i+1)
代替它,它会抛出异常,快速告诉您有关该问题的更多信息。
我的猜测是发生的事情是你正在击中Control-Z,它正在退出输入循环,但是当它试图计算单词时崩溃,所以当你修复时,一般情况下效果会更好。如果在修复其他问题(s?)之后你确实无法通过输入循环,并且你在Windows下运行,你可能会尝试使用F6而不是输入control-Z - 它似乎更可靠
答案 2 :(得分:0)
在使用cin时我几乎总是使用getline(特别是当我想要的是一个字符串时):
istream& std::getline( istream& is, string& s );
所以,你打电话给getline(cin, x)
,它会把所有东西都拿到新线上。无论如何,你必须等待cin的换行符给你任何东西。那么,在这种情况下,你的循环将成为:
while(getline(cin, x))
wordList.push_back(x);
答案 3 :(得分:0)
cin
不接受空格或换行符,因此除非您输入内容,否则cin
的执行无法完成,此处的测试程序可为您提供所需内容
#include "stdafx.h"
#include<iostream>
#include <string>
#include <sstream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
string str = "";
while(std::getline(cin, str) && str!="")
{
cout<<"got "<<str<<endl;
}
cout<<"out"<<endl;
cin>>str;
return 0;
}