Программа на C ++ не проходит шаг cin для ввода строки - PullRequest
2 голосов
/ 13 октября 2009

Я, очевидно, не совсем понимаю концепцию «конца файла» в 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 ]

3 голосов
/ 13 октября 2009

Если вы находитесь в Windows, ^ Z должен быть первым символом после новой строки, если вы находитесь в оболочке Unixy, вы хотите набрать ^ D.

1 голос
/ 13 октября 2009

Входная часть вашего кода работает. Единственная реальная проблема, с которой я сталкиваюсь - это попытка подсчитать слова:

for (int i = 0; i != size; i++) {
    if (wordList[i] == wordList[i+1]) {

Действительные подписки для wordList выполняются от 0 до size-1. На последней итерации вашего цикла i = size-1, но затем вы пытаетесь использовать wordList[i+1], индексируя за пределами вектора и получая неопределенные результаты. Если бы вы использовали wordList.at(i+1) вместо этого, это вызвало бы исключение, быстро сообщив вам больше о проблеме.

Я предполагаю, что происходит то, что вы нажимаете Control-Z, и он выходит из цикла ввода, но вылетает, когда пытается подсчитать слова, поэтому, когда вы исправляете, все будет работать лучше в целом. Если вы действительно не можете обойти цикл ввода после исправления другой проблемы (s?), И вы работаете под Windows, вы можете попробовать использовать F6 вместо ввода control-Z - это кажется немного более надежным .

0 голосов
/ 13 октября 2009

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;
}
0 голосов
/ 13 октября 2009

Я почти всегда использую getline при использовании cin (особенно, когда мне нужна строка):

istream& std::getline( istream& is, string& s );

Итак, вы бы позвонили getline(cin, x), и все было бы до новой строки. Вам все равно придется ждать, пока cin не выдаст вам что-либо. Таким образом, в этом случае ваш цикл станет:

while(getline(cin, x))
   wordList.push_back(x);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...