почему эта программа на C ++ работает для первой строки ввода, а не для второй или третьей? - PullRequest
0 голосов
/ 07 января 2019

Я хочу написать программу, которая печатает Real Fancy , если данная строка содержит " NOT " или " not " и регулярно представляются , если не содержат.

Пример: "это не строка" о / п: Real Fancy

"это ничто" о / п: регулярно фантазии

Проблема в том, что он печатает Real Fancy, если мой первый тестовый ввод " not is this line". Но если одна и та же строка указана в качестве входных данных во втором или выше тестовом примере, она не работает и печатается регулярно. Почему? Любая помощь?

Вот код:

#include <bits/stdc++.h>


using namespace std;

int main()
 {

   int t;//No.of test cases

   cin>>t;

   while(t--)
   {
    string quote;//the input from user
    string found="not";//word to be found
    string temp="";
    int not_found=0;
    cin.ignore();
    getline(cin,quote);

    //Splitting the given line into words and store in a vector
    vector<string> words;
    istringstream iss(quote);
    copy(istream_iterator<string>(iss),
    istream_iterator<string>(),
    back_inserter(words));

   //Scan for "not" and if found break from for loop
    for(int i=0;i<words.size();i++)
    {
        temp=words[i];
        transform(temp.begin(),temp.end(),temp.begin(),::tolower);
        if(temp==found)
        {
            cout<<"Real Fancy"<<endl;
            not_found=1;
            break;
        }
       }
      if(not_found==0)
        cout<<"regularly fancy"<<endl;

    }

    return 0;
 }

1 Ответ

0 голосов
/ 07 января 2019

Шаблон ввода выглядит как

t
quote
quote
quote
...

Чтение t

cin>>t;

останавливается, как только находит вход, который не может быть целым числом. Это включает символ новой строки, представляющий конец строки, оставляя символ новой строки в потоке для последующего использования (см. Почему std :: getline () пропускает ввод после форматированного извлечения? для получения дополнительной информации об этом проблема). Проблема пропуска была решена с помощью

cin.ignore();
getline(cin,quote);

в цикле while, но это обменивало одну ошибку на другую. Если не было предшествующего форматированного ввода, чтобы оставить нежелательные символы в потоке, cin.ignore(); будет выбрасывать допустимый первый символ ввода.

Это произойдет во втором и последующих чтениях. Вход будет выглядеть как

t //newline consumed by ignore
quote //newline consumed by getline. ignore consumes first character of next line
uote //newline consumed by getline. ignore consumes first character of next line
uote //newline consumed by getline. ignore consumes first character of next line
..

Решение:

Переместить его после ввода, которое оставляет нежелательный символ в потоке

cin>>t;
cin.ignore();

Лучшая альтернатива - ignore, так что вы можете быть уверены, что избавились от всего потенциального мусора в конце строки

cin>>t;
cin.ignore(numeric_limits<streamsize>::max(), '\n');

Это будет считывать из потока до максимально возможной длины потока, или будет найдена и отброшена новая строка, в зависимости от того, что произойдет раньше.

Всегда убирайте после операции, а не до следующей. Он сближает связанный код, способствует удобочитаемости и защищает вас от случаев, когда нет ничего, что нужно было бы очистить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...