我似乎无法使用v.push.back()来处理字符串

时间:2014-12-04 03:17:55

标签: c++ string push-back

// ConsoleApplication25.cpp : main project file.

#include "stdafx.h"
#include <iostream>
#include <string>
#include <iomanip>
#include <ios>
#include <vector>
#include <algorithm>

using namespace System;
using namespace std;

int main()
{
    vector<string> words;
    string x;

    cout << "Enter words followed by end of file: " << endl;

    while (cin >> x){
        words.push_back(x);
    }
    cout << endl;

    int count=0;
    string Uword;

    cout << "Enter the word you want me to count" << endl;
    cin >> Uword;

    for(int i = 0; i < (int)words.size(); ++i){
        if (Uword == words[i]){
            ++count;
        }

}

    cout << "You word appeared " << count << " times" << endl;

    system("pause");
    return 0;
}

有人可以告诉我我做错了什么吗? :/显然我不了解一个关键概念。该程序不断跳过我的第二个cin。并且甚至没有看到for循环,我也不知道为什么。

2 个答案:

答案 0 :(得分:0)

你的第一个while循环读取直到文件结束...文件结束后你的流状态设置了EOF位,这就是循环退出的原因。这也是为什么下一次cin >> Uword尝试退出而不做任何事情的原因。如果你写了类似的东西......

if (!(cin >> UWord))
{
     std::cerr << "unable to read uword from cin\n";
     return 1;
}

...(通常是一个好习惯)你已经注意到了失败。

解决这个问题的典型方法是使用一个“哨兵”字来表示单词集的结尾...例如:

std::cout << "Enter valid words followed by the sentinel <END>:\n";
while (std::cin >> x && x != "<END>")
    words.push_back(x);

之后阅读if时,您肯定想要使用Uword测试,这样您就可以在不看<END>的情况下识别并处理点击EOF。

或者,首先让他们输入Uword,然后让循环读取所有单词,直到EOF ....

值得注意的是,对于某些编译器/环境,cin可以“体验”多个EOF ...例如,在Windows CMD.EXE提示符的空行上按Control-Z会生成EOF,但是如果您致电cin重置EOF位,您可以继续阅读cin.clear()。也就是说,如果您编写的程序依赖于此,则无法使用以下语句自动调用/使用/测试它们:

echo word1 word2 word3 word2 <END> word2 | ./word_counter_app

cat test_case_1 | ./word_couner_app

./word_couner_app < ./test_cast_2

这种调用很有用,即使你不关心可移植性,也最好避免尝试阅读后EOF。

答案 1 :(得分:0)

第一次循环后,

cin将设置EOF。所以在你输入任何其他内容之前,你只需要清除它:

cin.clear();
cin >> UWord;