C ++程序没有超过cin步骤进行字符串输入

时间:2009-10-13 16:56:35

标签: c++ input

我显然没有完全得到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;
}

4 个答案:

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