wrangler
wrangler

Reputation: 3576

C++ Using std::getline in place of cin >>

In a problem were i have to take n number of strings as input and count the ones containing a given substring(case insensitive).

Here's my code:

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include<string>
using namespace std;
int main()
{
    std::string str2 = "hello";
    std::string str3 = "HELLO";
    short int n,count=0,i;
    cin>>n;
    std::string str1[n];
    for(i=0;i<n;i++)
    {
        std::getline(std::cin,str1[i]);   //here getline is taking only n-1  inputs
        std::size_t found1=str1[i].find(str2);
        std::size_t found2=str1[i].find(str3);
        if(found1!=std::string::npos || found2!=std::string::npos)
            count++;
    }
    cout<<count;
    return 0;
}

Since i cant use cin as string includes spaces or cin.getline() as have to use string type in place of char[].
Problem with my code is std::getline() is only taking n-1 inputs.Cant figure out why?

Upvotes: 2

Views: 808

Answers (2)

CodeBeginner
CodeBeginner

Reputation: 329

This code should work

#include <iostream>
#include <string>

using namespace std;

int main() {
    int n = 0, count = 0;
    cin >> n;

    do {
        string str;
        getline(cin, str);

        if (str.find("HELLO") != string::npos || str.find("hello") != string::npos) {
            count++;
        }
    } while (n-- && n >= 0);

    cout << count << endl;
    return 0;
}

Upvotes: 0

stark
stark

Reputation: 13189

The first getline after cin reads the remainder of the line, which is probably empty. This is why when reading user input, it is usually better to use getline and process input using code.

After cin >> n the input stream is positioned just after the number n. You can use a getline just to read the newline and then throw it away to position to the start of the next line.

Upvotes: 4

Related Questions