gogobaba Ответов: 2

Getline и cin производят различные выходные данные в C++


Я должен сосчитать количество раз, когда Суво и СУВОДЖИТ появляются в длинной строке.

Input=>
5
SUVOJITSUVOSUVOJITUCSUVOJITSUVOVXSUVOJITSUVOGMSUVODMMVDSUVOJIT
AXRSUVOJITHSUVOJITHSUVOJJSUVOJITSUVOJIT
SUVOJITPRQSUVOJIT
SUVOJITTXGSUVOUNSUVOJIT
SUVOJITSUVOSUVOJITXGSUVOSUVOQSUVOJITKDSALASUVOQESUVOHSSUVODFSUVOJITWSUVOUSUVOJITGJEM


В приведенной ниже программе,когда я беру getline для ввода строки, выход, который она генерирует, всегда состоит из SUVO=0, SUVOJIT=0 в первой строке .В то время как cin>> не производит такого рода поведение .

#include <iostream>
#include <string>

using namespace std;

int main(){
  int n;
  cin>>n;
  string s;
  for(int i=0;i<n;i++){ 
    cin>>s; //getline(cin,s)
    int s1=0,s2=0;
    for(int j=0;j<s.length();j++){
      if(s[j] == 'S'){
        if(s.substr(j,7).compare("SUVOJIT") == 0)
          s1++;
        else if(s.substr(j,4).compare("SUVO") == 0)
                s2++;
      }
      //
    }
       //
                
      cout<<"SUVO="<<s2<<", SUVOJIT="<<s1<<endl;
  }
                
         return 0;
                }


Что я уже пробовал:

Input=>
5
SUVOJITSUVOSUVOJITUCSUVOJITSUVOVXSUVOJITSUVOGMSUVODMMVDSUVOJIT
AXRSUVOJITHSUVOJITHSUVOJJSUVOJITSUVOJIT
SUVOJITPRQSUVOJIT
SUVOJITTXGSUVOUNSUVOJIT
SUVOJITSUVOSUVOJITXGSUVOSUVOQSUVOJITKDSALASUVOQESUVOHSSUVODFSUVOJITWSUVOUSUVOJITGJEM

2 Ответов

Рейтинг:
4

KarstenK

Стоит обратить внимание, что "Суво" является частью "SUVOJIT" и так "SUVOJIT" тоже происшествием на "Суво" и КОСЯК происходят без"Суво".

if(s[j] == 'S'){
    if(s.substr(j,4).compare("SUVO") == 0) {
      s1++;
    if(s.substr(j,7).compare("SUVOJIT") == 0) //removed else
      s2++;
    }
}
Примечание: сделайте некоторый вывод для пользователя перед вводом и я действительно не стал бы использовать s1 или s2 для int count => count1 и count2.


Рейтинг:
13

Jochen Arndt

Это потому что getline (string) - ссылка на C++ [^] и то же самое istream::operator>> - Ссылка на C++ [^] вести себя иначе.

getline() читает до тех пор, пока разделительный символ (новая строка \n по умолчанию) считывается и отбрасывает этот символ.

То istream >> оператор со строками пропускает ведущие пробелы (например, пробел, табуляцию, новую строку) и читает их до тех пор, пока не встретится символ пробела. Этот символ пробела не считывается, а остается во входном буфере.

Ты звонишь

cin>>n;
первоначально. Это будет считывать введенное число, но позволит символу новой строки войти во входной буфер. При звонке getline() после этого он прочитает новую строку как первый символ и остановится. То есть: у вас есть пустая строка. При использовании istream >> оператор вместо этого пропустит символ новой строки и прочитает содержимое следующей строки.

Из-за этого различного поведения не рекомендуется смешивать getline() и >> оператор вызывает тот же поток.